Firebase观察数据异步



我正试图以异步方式观察实时数据库中的数据。

我使用了"withCheckedContinuation"来返回结果,但我在IOS文档中看到,Continuation只能是"resume"。所以每次我更新数据库中的数据都会破坏我的应用程序。

我想知道我正在尝试的是可能的,或者是否有其他方法来处理这个问题,使函数保持异步。

class StoreFirebase {
private let ref = Database.database().reference()
var driverObserver: UInt?
var driverReference: DatabaseReference?

func getDriverSingleLocation(_ uuid: String) async -> Result<StoreData, Error> {

return await withCheckedContinuation { continuation in
driverReference?.observeSingleEvent(of: .value) { (snapshot) in
if let dictionary = snapshot.value as? StoreData {
continuation.resume(returning: .success(dictionary))
} else {
continuation.resume(returning: .failure(HTTPError(.badRequest)))
}
}
}
}

func getDriverLocation(_ uuid: String) async -> Result<StoreData, Error> {
driverReference = ref.child("driversAvailable").child(uuid)

return await withCheckedContinuation { continuation in
var nillableContinuation: CheckedContinuation<Result<StoreData, Error>, Never>? = continuation
driverObserver = driverReference?.observe(.value) { (snapshot) in
if let dictionary = snapshot.value as? StoreData {
nillableContinuation?.resume(returning: .success(dictionary))


} else {
nillableContinuation?.resume(returning: .failure(HTTPError(.badRequest)))

}
}
}
}
}

谢谢你的评论,用AsyncStream修复它

class RealTimeDatabaseService: RealTimeDatabaseProtocol {
private let ref = Database.database().reference()
var driverObserver: UInt?
var driverReference: DatabaseReference?

func getDriverLocation(_ uuid: String) -> AsyncStream <Result<StoreData, Error>> {
driverReference = ref.child("driversAvailable").child(uuid)

return AsyncStream { continuation in
driverObserver = driverReference?.observe(.value) { (snapshot) in
if let dictionary = snapshot.value as? StoreData {
continuation.yield(.success(dictionary))
} else {
continuation.yield(.failure(HTTPError(.badRequest)))
continuation.finish()
}
}
}
}
func getDriverLocationResult() async  {
for try await response in 'getDriverLocation'("uid") {
switch response {
case .success(let storeDate):
print("completed: (storeDate)")
case .failure(let error):
print("error: (error)")
}
}
}

最新更新