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

标签 ios swift asynchronous dispatch

func getTopicIdFromMYSQL(){
    let myUrl = NSURL(string: "xxxx")
    let request = NSMutableURLRequest(URL: myUrl!)
    request.HTTPMethod = "POST"
    let email:String = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="bec6c6c6fed9d3dfd7d290ddd1d3" rel="noreferrer noopener nofollow">[email protected]</a>"
    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
    }
}

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

func getTopicIdFromMYSQL(completion: (AnyObject?, ErrorType?) {
    let myUrl = NSURL(string: "xxxx")
    let request = NSMutableURLRequest(URL: myUrl!)
    request.HTTPMethod = "POST"
    let email:String = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="730b0b0b33141e121a1f5d101c1e" rel="noreferrer noopener nofollow">[email protected]</a>"
    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()
}

关于ios - 如何顺序执行两个异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35551771/

相关文章:

asynchronous - Play Framework 作业队列

python - 如何捕获源自reactor.stop()的Deferred中未处理的错误

ios - XCode - “' autorelease' 不可用 : not available in ARC mode”

ios - 防止 Angular NativeScript WebView 通过捏缩放进行缩放

swift - 为什么不调用方法 updateSearchResultsForSearchController?

javascript - 使用 async 和 defer 按顺序加载脚本

ios - 在Objective-C中从Sqlite读取数据

ios - SwiftUI 列表 - 禁用特定行的 move ?

swift - 如何转换下面的代码,以便我扫描多个对象,每个对象具有不同的 .sks 文件?

swift - 从父 View 控制 NSTabViewController