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

Ios 如何顺序执行两个异步函数,ios,swift,asynchronous,dispatch,Ios,Swift,Asynchronous,Dispatch,} 我已经得到了这个代码,但是,我想在它之后运行另一个函数。我该怎么办。比如: func getTopicIdFromMYSQL(){ let myUrl = NSURL(string: "xxxx") let request = NSMutableURLRequest(URL: myUrl!) request.HTTPMethod = "POST" let email:String = "xxx@gmail.com" let postString = "

} 我已经得到了这个代码,但是,我想在它之后运行另一个函数。我该怎么办。比如:

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()

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

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

getTopicIdFromMYSQL()
getCommentFromMYSQL()
print("Finish")
但是,由于代码是按顺序执行的,因此在异步调用完成之前会调用方法
getCommentFromMYSQL()
。您应该在以下条件中调用
getCommentFromMYSQL()

NSURLSession.sharedSession().dataTaskWithRequest(request)

或者你想什么时候都行。这将确保在第一个方法完成其执行后调用方法
getCommentFromMYSQL()

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

如果要按顺序执行,请在分派到主队列后调用下一个方法

if (resultValue == "Success") {
}

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

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)
                }
            })
注意: 当异步函数完成时,必须最终调用完成处理程序——要么是错误,要么是计算值

然后按如下所示调用这些函数:

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

将它们转换为NSOperations,使每个操作都依赖于上一个操作。WWDC 15有一段很好的视频
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()
}