如何使用完成处理程序等待firestore请求的完成

时间:2017-12-19 13:09:24

标签: swift google-cloud-firestore

我慢慢地绕着完成处理程序。 如果我有一个firestore查询,如果我想使用一个完成处理程序,我必须在firestore查询完成时使用completion()。

但它设置的功能仍让我感到困惑。

因此,如果这是一个以闭包作为参数的函数定义:

  func doSomethingAsync(completion: () -> ()) {
  }

我不太了解如何从上面的func定义中获取并实现它的真实内容,如firestore查询和请求。

 query.getDocuments(){ (querySnapshot, err) in

                if let err = err
                {
                    print("Error getting documents: \(err)")
                }
                else
                {
                    if(querySnapshot?.isEmpty)!
                    {


                        print("there's no document")
                        completion()


                    }
                    else
                    {
                        for document in querySnapshot!.documents
                        {

                            completion()

                        }
                    }
                }

            }

感谢。

更新

所以我的例子可以做一些像

这样的事情
func getFirestoreData(userID: String, completion @escaping() -> ()){

//firestore code:

query.getDocuments(){ (querySnapshot, err) in

                    if let err = err
                    {
                        print("executed first")
                        completion()
                    }
                    else
                  .......
                    print("executed first")
                    completion()

       }
}

要调用我正在执行的功能:

getFirestoreData(userID: theUserID) {

            print("executes second")

        }

print("executes third") after function execution.

我想要发生的是编程在继续执行之前等待完成()。

但是"执行第三个"首先发生,然后"先执行#34;然后"执行第二个"。

由于

1 个答案:

答案 0 :(得分:-1)

以下是完整示例(使用API​​调用) 请注意:状态变量只是指出服务器响应的关键 (0:来自服务器的错误,1:成功,-1:我的代码中出错了)

 func logout(handlerBack: @escaping (_ error: Error?, _ status:Int?, _ error_message:String?)->())
{

    Alamofire.request(url, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil)
        .responseJSON { respons in
            switch respons.result {
            case .failure(let theError):
                handlerBack(theError, 0, nil)

            case .success(let data):
                let json_data = JSON(data)

                /// if couldn't fetch data
                guard let status = json_data["status"].int else {
                    handlerBack(nil,-1, "can't find status")
                    return
                }

                /// if statuse == 0
                    guard status == 1 else {
                        handlerBack (nil, 0 , json_data["errorDetails"].string)
                        return
                    }

                // that's means everything fine :)
                    handlerBack(nil, 1 , nil)
                }
        }
    }

以下是实现它的方法:

        // call func 
  self.logout { (error:error, status:Int, error_message:String) in
            // if status not 1, figure out the error 
        guard status == 1 else {
            // try to find error from server
            guard let error_message = error_message else {
            // else error something else 
                print ("Error at :: \(#function)")
                // don't do anything ..just return 
                return
            }
            self.showMessageToUser(title: error_message, message: "", ch: {})
            return
        }
                   // this part do what ever you want, means every thing allright 
    }

更新: 你正在寻找等待单位执行的东西" First"和"第二"

在这种情况下,使用DispatchGroup()就是示例:

            var _dispatch_group = DispatchGroup()

        getFirestoreData(userID: theUserID) {

            _dispatch_group.enter()
            print("executes second")


            _dispatch_group.leave()

        }

        _dispatch_group.notify(queue: .main) {
        print("executes third")
        }

输出是:

executes First
executes Second
executes Third