如何在闭包 SWIFT 中使用构造等待同步

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

我有一个从 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?)
    
}

我试图在加载数据函数中等待,但结果要么出现错误,要么什么都不起作用

swift asynchronous async-await dispatch dispatch-queue
© www.soinside.com 2019 - 2024. All rights reserved.