Swift - 网络请求和后台队列

时间:2017-04-26 14:05:50

标签: swift api networking grand-central-dispatch

只想澄清一下在Swift 2中进行网络api调用的最佳实践。

以下是我的典型网络请求下载JSON数据的方式:

let session = NSURLSession(configuration: .defaultSessionConfiguration())
let url = NSURL(string: my_url_string)
let request = NSURLRequest(URL: url)

let dataTask = session.dataTaskWithRequest(request) { data, response, error in
   do {
       self.tableData = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! [NSDictionary]
       dispatch_async(dispatch_get_main_queue(), { () -> Void in
          self.tableView.reloadData()
       })
   } catch let error {
        print(error)
   }
}
dataTask.resume()

我的问题是:我应该将所有这些代码块都包装到后台队列中吗?我应该这样做:

let download_queue = dispatch_queue_create("download", nil)
dispatch_async(download_queue) { () -> Void in
     previous code here
}

或者我应该使用给定的高优先级队列之一,例如:

dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)

此外,在后续视图控制器上发出额外的网络请求时,我应该使用我在这里使用的相同队列,还是应该创建一个新队列?

1 个答案:

答案 0 :(得分:0)

默认情况下NSURLSession API是高度异步的。来自Apple docs的有用信息。

没有明显的问题表明用GCD包装你的代码块,并且还在后台线程上运行完成块,因此正确使用GCD来更新UITableview