ios - 如何等待 Swift 3 中的 Firebase 异步读取调用?

标签 ios swift firebase asynchronous swift3

<分区>

我有一个函数,我可以在其中对 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() 调用中锁定信号量,因为该函数仍会在调用开始之前返回?

最佳答案

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

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

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

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

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

关于ios - 如何等待 Swift 3 中的 Firebase 异步读取调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47024355/

相关文章:

ios - Clang : error: linker command failed with exit code 1 (use -v to see invocation) Xcode 10, Xcode 10.1 Beta,Swift 4.2

ios - NSPredicate 不会工作?

ios - UITableview 中的 UICollectionView - 获取点击的 UICollectionView 的标签

android - 修改了 URL 的 Firebase 崩溃日志

java - 在 Firebase 数据库中添加不同的键时遇到问题

reactjs - Firebase 托管 + 使用 webpack 进行 React

ios - 设置 iOS 导航元素

php - 在 php 中正确放置和命名 .pem 文件以用于苹果通知的位置

ios - 如何为 PencilKit 创建 .drawing 文件?

swift - 如何使用 react-native 组件创建一个 swift 项目?