如何在闭包中使用构造 await sync

问题描述 投票:0回答:1

我有一个从 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
函数中等待,但结果要么出现错误,要么什么都不起作用

swift asynchronous async-await dispatch dispatch-queue
1个回答
0
投票

你没有

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 }
    
© www.soinside.com 2019 - 2024. All rights reserved.