如何顺序执行两个异步函数

func getTopicIdFromMYSQL(){ let myUrl = NSURL(string: "xxxx") let request = NSMutableURLRequest(URL: myUrl!) request.HTTPMethod = "POST" let email:String = "xxx@gmail.com" let postString = "email=\(email)" request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in if(error != nil){ print("Get all topic") print("error=\(error)") return } do { let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary if let parseJSON = json { let resultValue = parseJSON["status"] as? String print("Get all topic") favouriteTopic = parseJSON["getResult"]! as! [AnyObject] print("return topic:\(favouriteTopic)") dispatch_async(dispatch_get_main_queue(), { if(resultValue == "Success"){ } else{ let error = UIAlertController(title: "Error", message: "Please check your network configuration!:-(", preferredStyle: .Alert) let cancel = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) let ok = UIAlertAction(title: "OK", style: .Default, handler: nil) error.addAction(cancel) error.addAction(ok) } }) } }catch { print(error) } } task.resume() 

我已经有了这个代码,但是,我希望在它之后运行另一个函数。 我该怎么办。 喜欢:

 getTopicIdFromMYSQL() getCommentFromMYSQL() print("Finish") 

我发现问题是我的代码没有按顺序执行,函数getCommentFromMYSQL几乎与getTopicIdFromMYSQL相同,我想运行这三个以便我该怎么办?

将完成处理程序作为参数添加到异步函数中:

 func getTopicIdFromMYSQL(completion: (AnyObject?, ErrorType?)->()) func getCommentFromMYSQL(completion: (AnyObject?, ErrorType?)->()) 

注意:异步函数完成时必须最终调用完成处理程序 – 带有错误或计算值。

然后,您可以调用这些函数,如下所示:

 getTopicIdFromMYSQL() { (result1, error) in if let result1 = result1 { // process result1 // ... getCommentFromMYSQL() { (result2, error) in if let result2 = result2 { // process result2 // ... } else { // handle error } } } else { // handle error } } 

您可以按如下方式实现这些function:

 func getTopicIdFromMYSQL(completion: (AnyObject?, ErrorType?) { let myUrl = NSURL(string: "xxxx") let request = NSMutableURLRequest(URL: myUrl!) request.HTTPMethod = "POST" let email:String = "xxx@gmail.com" let postString = "email=\(email)" request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in if error != nil { completion(nil, error) } do { let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary if let parseJSON = json { let resultValue = parseJSON["status"] as? String print("Get all topic") favouriteTopic = parseJSON["getResult"]! as! [AnyObject] completion(favouriteTopic, nil) } else { throw MyError.Error(message: "bogus JSON") } } catch let error { completion(nil, error) } } task.resume() } 

代码总是按顺序执行。 我认为你的问题是你在这行中进行异步调用:

 NSURLSession.sharedSession().dataTaskWithRequest(request) 

但是,由于代码是按顺序执行的,因此在异步调用完成之前调用getCommentFromMYSQL()方法。 你应该在这个条件中调用getCommentFromMYSQL()

 if (resultValue == "Success") { } 

或者随时随地。 这将确保在第一个方法完成执行后调用方法getCommentFromMYSQL()

这是因为,您正在进行异步调用,它在后台线程中运行。

如果希望它们按顺序执行,请在调度到主队列后调用下一个方法,

 dispatch_async(dispatch_get_main_queue(), { //call here getCommentFromMYSQL() if(resultValue == "Success"){ } else{ let error = UIAlertController(title: "Error", message: "Please check your network configuration!:-(", preferredStyle: .Alert) let cancel = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) let ok = UIAlertAction(title: "OK", style: .Default, handler: nil) error.addAction(cancel) error.addAction(ok) } })