Как прослушивать завершение задачи Firebase?

#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 .