我有这个快速代码:
private func checkPhoneNumber(number: String,completion: @escaping (Result<Int, Error>) -> Void) -> () {
self.db.collection("customers").whereField("telephone", isEqualTo: number).getDocuments() { (querysnapshot,err) in
DispatchQueue.main.async {
completion(.success(querysnapshot!.documents.count))
}
}
}
@State private var ret = true
private func validateIns(phone:String) -> Bool{
checkPhoneNumber(number: phone, completion: { documentCount in
if documentCount>0{
self.ret = false;
}
})
return self.ret
}
我希望我的checkPhoneNumber
首先从Firebase获取数据,然后根据来自Firebase的数据返回validateIns
。但是,由于firebase需要1-2秒,因此self.net
始终返回true,尽管documentCount值为。我该如何解决?
答案 0 :(得分:0)
由于checknumber函数是异步调度的,因此它在主队列中的顺序不正确。从本质上讲,这意味着程序正在等待数据库查询的结果,它将运行其余代码,因此:
@State private var ret = true
将始终为真。也许通过改变顺序就可以得到所需的结果。可能会发生一些类似的事情,这取决于在其余代码中如何使用func。
private func checkPhoneNumber(number: String,completion: @escaping (Result<Bool, Error>) -> Void) -> () {
self.db.collection("customers").whereField("telephone", isEqualTo: number).getDocuments() { (querysnapshot,err) in
DispatchQueue.main.async {
//##check doc count then move forward##
if completion(.success(querysnapshot!.documents.count)) > 0 {
self.ret = false
}
return self.ret
}
}