2016-05-08 3 views
0

Я пытаюсь написать функцию, которая будет возвращать массив всех моих рабочих, но она возвращается перед извлечением данных из firebaseFinish асинхронная задача Firebase с Swift

вот мой код:

func getWorkersList() -> ([Worker]) 
{ 
    let workersInfoRef = ref.childByAppendingPath("countries/\(userCountry)/cities/\(userCity)/workers/\(workFieldToRecieve)/") 

    var workerList = [Worker]() 
     workersInfoRef.queryOrderedByChild("name").observeSingleEventOfType(.Value, withBlock: { (snapshot) in 

     print(snapshot.childrenCount) 
     for rest in snapshot.children.allObjects as! [FDataSnapshot]{ 

      let workerInfo = Worker(uid: rest.value["uid"] as! String, name: rest.value["name"] as! String, city: rest.value["city"] as! String, profession: rest.value["profession"] as! String, phone: rest.value["phone"] as! String, email: rest.value["email"] as! String, country: rest.value["country"] as! String) 
      workerList.append(workerInfo) 

     } 
     }) { (error) in 
      print(error.description) 
    } 

    print(workerList.count) 
    return workerList 

} 

ответ

2

Это не тестируется ... Я просто закодированы его на лету, чтобы дать вам общее представление о том

добавить завершение блок/обратного вызова для вашей функции ...

func getWorkersList(callback: ((data:[Worker]) ->Void)) { 
    let workersInfoRef = ref.childByAppendingPath("countries/\(userCountry)/cities/\(userCity)/workers/\(workFieldToRecieve)/") 

    var workerList = [Worker]() 
    workersInfoRef.queryOrderedByChild("name") 
     .observeSingleEventOfType(.Value, withBlock: { (snapshot) in 

     print(snapshot.childrenCount) 
     for rest in snapshot.children.allObjects as! [FDataSnapshot]{ 

      let workerInfo = Worker(uid: rest.value["uid"] as! String, name: rest.value["name"] as! String, city: rest.value["city"] as! String, profession: rest.value["profession"] as! String, phone: rest.value["phone"] as! String, email: rest.value["email"] as! String, country: rest.value["country"] as! String) 
      workerList.append(workerInfo) 

     } 
     print(workerList.count) 
     callback(workerList) 

    }) { (error) in print(error.description) } 
} 

проход в блоке завершения ..

getWorkersList(callback: { (data:[Worker]) -> Void in 
    print(data) 
}) 
+0

Какова цель обратных вызовов? Я думаю, что это может вызвать проблемы с использованием асинхронных обратных вызовов при асинхронном вызове Firebase. (??) – Jay

+1

обратный вызов вернет массив вызывающему абоненту ... вы возвращаете массив до завершения завершения. –

+0

Я не был OP, но ваш ответ, безусловно, способ сделать это. Ему нужно несколько мелких настроек, но это довольно важно. – Jay

0

код в ваш вопрос не работает в связи с фундаментальным вопросом: Firebase является асинхронным и нельзя назвать возвращать значения, как у функция.

Данные пожарной базы жизнеспособны только тогда, когда (в пределах) выполненный блок завершен.

Код приложения работает намного быстрее, чем в Интернете, поэтому, если вы сообщите Firebase для получения данных, а затем попытайтесь работать с этими данными за пределами блока (например, с помощью return workerList), то возврат будет срабатывать до того, как данные Firebase будут готовы , и вы будете возвращать нуль иногда, может быть, всегда.

Так что вы делаете? Вы вводите асинхронный код.

Скажем, например, у вас есть tableView, в котором представлен список работников. Вот концептуальное поток

tell firebase to get data withBlock { 
    iterate over returned snapshot data to populate an array 
    when done, tableView.reloadData 
} 

Ключ должен использовать асинхронную природу Firebase и написать код, который работает с Firebase.

Смежные вопросы