在执行下一个代码行之前等待任务结束

时间:2015-07-20 08:42:58

标签: ios xcode swift

我的iOS应用有问题。问题是导致我的部分代码下载了一个"频道列表" (JSON),我需要在执行下一行之前结束此任务。我尝试使用dispatch_async,但我没有得到好结果,因为下一行总是在下载任务结束之前执行。

class RemoteAPI {
    var remoteUrl = ""
    func getData(completionHandler: ((JSON!, NSError!) -> Void)!) -> Void {


       //let url: NSURL = NSURL(string: "https://api.cxntv.com/api/v1/videos/?type=canales&ordering=-id")
       let url: NSURL = NSURL(string: remoteUrl)!
       let request: NSMutableURLRequest = NSMutableURLRequest(URL: url)
       let session = NSURLSession.sharedSession()
       //[mutableRequest addValue:@"x32dsds-223" forHTTPHeaderField:@"X_ROKU_ID"];
       println(request.HTTPBody)

       //request.addValue("xxx", forHTTPHeaderField: "yyy")
       request.addValue("xxx" ,forHTTPHeaderField: "zzz")

       let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in

       /* All my code for the httppetition ....*/

我调用了getgadata函数:

api.remoteUrl = "example"

    api.getData({data, error -> Void in
        if (data != nil){
            // Fix possible error if no "results" key
            if let results = data["results"].array {
                self.items = results
            }
            dispatch_async(dispatch_get_main_queue()) {
                self.tableView.reloadData()
                self.viewUtils.hideActivityIndicator(self.view)
            }
            println("Data reloaded")
        } else {
            println("api.getData failed")
            println(error)
        }
    })

/* next line code for execute....

I need these code lines to wait so that the getdata function ends before it can be executed.

*/

1 个答案:

答案 0 :(得分:0)

完成处理程序在一个代码块中运行,该代码块是异步的,并且将作为后台中的另一个线程运行,主线程在块之后直接进入代码。

// Step A.
api.getData({data, error -> Void in
    // Step B.
    if (data != nil){
        // Fix possible error if no "results" key
        if let results = data["results"].array {
            self.items = results
        }
        dispatch_async(dispatch_get_main_queue()) {
            self.tableView.reloadData()
            self.viewUtils.hideActivityIndicator(self.view)
        }
        println("Data reloaded")
    } else {
        println("api.getData failed")
        println(error)
    }
    // Move your code here.
})
// Step C.

在这种情况下,完成执行的顺序可以是A - >; B - > C或A - >; C - > B,在你的情况下,是后者。您必须将代码放在块中以确保它遵循正确的顺序。