firebase 如何改变函数使其异步?

gjmwrych  于 2023-02-05  发布在  其他
关注(0)|答案(2)|浏览(125)

我是Swift的新手,在理解异步函数的工作原理方面遇到了一些麻烦。我需要创建一个包含Firebase对象所有子键的数组,然后返回它。
这是我的准则

import Foundation
import FirebaseDatabase
import FirebaseDatabaseSwift

class SettingsViewModel: ObservableObject {
    var ref = Database.database().reference()
    
    func getInstituteList(course: String) -> [String] {
        var allGroupArray = [String]()
        
        ref.child("Курс - \(course)").observeSingleEvent(of: .value, with: { snapshot in
            for child in snapshot.children {
                let snap = child as! DataSnapshot
                allGroupArray.append(snap.key)
            }
            
        })
        return allGroupArray
    }
}

返回的值是给另一个变量在一个选择器。我知道这个函数应该是异步的,否则数据不会到达的时间。我只是真的需要有人使这个函数异步,因为我不能理解它自己。

nbysray5

nbysray51#

我不知道Firebase是否支持async/await,但是添加continuation非常容易

func getInstituteList(course: String) async -> [String] {
    return await withCheckedContinuation { continuation in
        var allGroupArray = [String]()
        ref.child("Курс - \(course)").observeSingleEvent(of: .value, with: { snapshot in
            for child in snapshot.children {
                let snap = child as! DataSnapshot
                allGroupArray.append(snap.key)
            }
            continuation.resume(returning: allGroupArray)
        })
    }
}
rjzwgtxy

rjzwgtxy2#

这个answer提到了DatabaseReference.getData() async函数,如果我理解正确的话,那么你可以这样做:

func getInstituteList(course: String) async -> [String] {
    let data = await ref.child("Курс - \(course)").getData()
    return data.children as! [DataSnapshot]
}

相关问题