#ios #uitableview #firebase #firebase-realtime-database #swift3
#iOS #uitableview #firebase #firebase-база данных в реальном времени #swift3
Вопрос:
В этом руководстве их код Firebase разбросан по всему контроллеру. Это упрощает перезагрузку tableview при возврате Firebase, поскольку ваш reload()
код находится в существующем .observe()
.
ref.queryOrdered(byChild: "completed").observe(.value, with: { snapshot in
var newItems: [GroceryItem] = []
for item in snapshot.children {
let groceryItem = GroceryItem(snapshot: item as! FIRDataSnapshot)
newItems.append(groceryItem)
}
self.items = newItems
self.tableView.reloadData()
})
Как можно обработать вышесказанное, если код Firebase находится в классе? Мне все еще нужно перезагрузить tableview, но только после возврата Firebase. Это выглядит так:
f.performCompletedQuery()
self.tableView.reloadData()
f.performCompletedQuery()
будет выполняться, но путь к коду будет продолжаться, пока данные все еще извлекаются из Firebase. self.tableView.reloadData()
затем сработает, и таблица будет пустой (потому что Firebase еще не вернулась).
Я предполагаю, что мне нужно повторить наблюдение Firebase, но выставить его в классе и отключить существующее наблюдение? Кажется немного запутанным. Есть ли лучший способ? Может быть, просто заблокировать, отобразить и анимировать?
Комментарии:
1. Рассматривался вопрос о добавлении completionBlock: в вашем performCompletedQuery()?
Ответ №1:
для этого используйте обработчик завершения. пример:
func queryOrdered(completion: (_ result: [Any]) -> ()) {
// request here
// getting response check on error
// set completion for returned itmes if success
completion([1, 2, 3])
}
// call the function
queryOrdered { [unowned self] (arr) in
// get returned items
self.myitems = arr
// reload the table on main queue
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
Комментарии:
1. Вы больше не используете .observe()? Что такое
[unowned self]
?2. Теперь это работает. Единственное, мне не нужен параметр для блока завершения, но я не знаю, как его удалить. У вас есть какие-то идеи по этому поводу?
3. @4thSpace просто поместите функцию void в качестве параметра, например: func queryOrdered(завершение: () -> ()) {завершение() } ,[unowned self] используется для пропуска цикла сохранения для self .