我慢慢地绕着完成处理程序。 如果我有一个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;然后"执行第二个"。
由于
答案 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