【问题标题】:How to wait for Firebase asynchronous read call in Swift 3? [duplicate]如何在 Swift 3 中等待 Firebase 异步读取调用? [复制]
【发布时间】:2018-04-11 23:16:58
【问题描述】:

我有一个函数可以对 Firebase 进行异步读取调用以填充数组。该函数在调用未完成的情况下返回。如何等待异步调用完成然后返回数组? 我尝试过使用 dispatchQueue 和信号量,但我不知道如何解决这个问题。

class func generateModelArray() -> [Model]{
    var dbref: DatabaseReference?
    dbref = Database.database().reference()
    var modelAry = [Model]()
    let semaphore = DispatchSemaphore(value: 1)
    dbref?.child("Parts").observe(.childAdded, with: { (snapshot) in
        semaphore.wait()
        let partName = snapshot.key
        let dict = snapshot.value! as? [String:AnyObject]
        let partYear = dict!["year"] as! String
        let partPrice = dict!["price"] as! String
        //print(partName, partYear, partPrice)
        let mod = Model(name: partName, year: partYear, price: partPrice)
        modelAry.append(mod)
        print(modelAry)
        semaphore.signal()
    })
    semaphore.wait()
    return modelAry
}

根据我对linux中信号量的理解,当我锁定信号量时,它会阻塞另一个线程,当我发出信号时,它会解锁信号量并允许另一个线程继续。由于函数仍会在调用开始之前返回,如何在 observe() 调用中锁定信号量?

【问题讨论】:

    标签: ios swift firebase asynchronous swift3


    【解决方案1】:

    对于异步调用,您需要计划在异步调用执行完成之前完成您的代码。将完成处理程序闭包传递到您使用 Firebase 的结果调用的函数中。像这样的:

    class func generateModelArray(complete: @escaping (_ result: Bool, _ error: Error?)->Void) -> [Model]{
    

    然后当 Firebase 回来时,你可以调用你的完整函数:

    var someResult = true
    var someError = nil
    complete(someResult, someError)
    

    根据您要返回的内容调整完整函数接受的参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 2018-07-20
      • 2021-10-13
      • 2022-08-04
      • 1970-01-01
      • 2021-04-16
      • 2018-01-02
      相关资源
      最近更新 更多