【问题标题】:Finish asynchronous task in Firebase with Swift使用 Swift 在 Firebase 中完成异步任务
【发布时间】:2016-09-03 10:36:09
【问题描述】:

我正在尝试编写一个函数,该函数将返回我所有工作人员的数组,但它在从 firebase 检索数据之前返回

这是我的代码:

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

}

【问题讨论】:

    标签: swift firebase asynchronous firebase-realtime-database


    【解决方案1】:

    这未经测试...我只是在运行中对其进行编码,以便为您提供总体思路

    向您的函数添加完成块/回调...

    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)
    })
    

    【讨论】:

    • 回调的目的是什么?我认为这可能会导致在异步 Firebase 调用上使用异步回调时出现问题。 (??)
    • 回调会将数组返回给调用者...您在 withBlock 完成之前返回数组。
    • 我不是 OP,但您的回答肯定是一种方法。它需要一些小的调整,但它非常重要。
    【解决方案2】:

    由于一个基本问题,您问题中的代码不起作用:Firebase 是异步的,不能像函数一样被调用来返回值。

    Firebase 数据仅在(在)获取数据的块完成后才可用。

    应用程序代码的运行速度比互联网快得多,因此,如果您告诉 Firebase 获取数据,然后尝试在块外使用该数据(例如使用 return workerList),则返回将在 Firebase 数据准备好之前触发,你有时会返回 nil,也许总是。

    那你是做什么的?您以异步方式编写代码。

    例如,您有一个 tableView,它显示了一个工人列表。这是一个概念流程

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

    关键是利用 Firebase 的异步特性并编写与 Firebase 配合使用的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多