我有一个从 firebase 加载数据的代码,数据没有立即加载,我想先加载数据,然后将数据传递给委托。 为此,我使用了 wait 构造和同步 loadData 函数
let dateUser = await loadData(phoneNumber: phoneNumber)
按照思路,
dateUser
变量应该等到函数返回结果,但是函数没有等到数据加载就立即返回结果
你能告诉我错误是什么吗,我认为你需要在
loadData
函数中等待,但是在哪里?
到处都有如何使用这种构造来加载 JSON 文件的示例,但我没有找到它在闭包中的什么地方使用
这里是示例代码
struct LoadData {
let db = Firestore.firestore()
var delegate: LoadDataDelegate?
func getData(phoneNumber:String){
Task.init {
let dateUser = await loadData(phoneNumber: phoneNumber)
print("Делегат получил дату - ", dateUser)
delegate!.loadData(date: dateUser)
}
}
func loadData(phoneNumber: String) async -> TimeInterval? {
var existingUser = false /// Проверка существует ли пользователь с данным номером телефона в базе
var date: TimeInterval?
db.collection("Users").getDocuments { QuerySnapshot, Error in
if let err = Error {
print("Ошибка получения данных - \(err)")
}
for document in QuerySnapshot!.documents {
if document.documentID == phoneNumber { /// Если текущий пользователь уже был зарегестрирован
existingUser = true
date = document["dateFirstLaunch"] as? TimeInterval /// Преобразуем данные из FireBase
print("это дата ",date!)
}
}
if existingUser == false { /// Если такого пользователя не было
print("New User")
db.collection("Users").document(phoneNumber).setData(["dateFirstLaunch" : NSDate().timeIntervalSince1970]) { error in
if let err = error {
print("Ошибка записи данных в обалко - \(err)")
}
}
}
}
return date
}
}
protocol LoadDataDelegate {
func loadData(date: TimeInterval?)
}
我试图在
loadData
函数中等待,但结果要么出现错误,要么什么都不起作用
你没有
await
在loadData
中进行任何异步操作,所以loadData
立即返回。
您应该使用
async
版本的 Firebase Firestore API,而不是那些带有完成处理程序的版本。
不是传递完成处理程序,
try await
异步操作。只需将代码放在完成处理程序中在try await
行之后,并使用
catch
块处理错误。例如:
func loadData(phoneNumber: String) async -> TimeInterval? {
do {
let querySnapshot = try await db.collection("Users").getDocuments()
for document in querySnapshot.documents {
if document.documentID == phoneNumber {
return document["dateFirstLaunch"] as? TimeInterval
}
}
} catch {
print("Ошибка получения данных - \(error)")
// I assume you want to return nil immediately in this case and not write to the document
return nil
}
print("New User")
do {
try await db.collection("Users").document(phoneNumber).setData(["dateFirstLaunch" : Date().timeIntervalSince1970])
} catch {
print("Ошибка записи данных в обалко - \(error)")
}
// I assume that in the new user case, you want to return nil
return nil
}