SwiftUI在返回之前等待完成功能

时间:2020-06-15 10:43:10

标签: swift

我有这个快速代码:

   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值为。我该如何解决?

1 个答案:

答案 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
        }
    }