Swift iOS如何获得NSURLSession的结果

时间:2015-08-11 11:01:09

标签: ios swift networking nsurlsession

我对NSURLSession有疑问  我使用JSON下载了NSURLSession个数据  我想从这个代码块之外访问JSON enter code here数据变量,所以我操纵它

这是我的代码

 // variable declared in my class
 var jsonData = JSON("")

// my function
 func loadCategories(){

var url = NSURL(string: "http://localhost:8888/api/v1/getAllCategories")

var request = NSMutableURLRequest(URL:url!)

request.HTTPMethod = "GET"

NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data: NSData!, response: NSURLResponse!, errors: NSError!) in

self.jsonData = JSON(data: data)
 }).resume()
 }

当我尝试将jsonData放在NSURLSession块之外时,我得到空变量

任何帮助?

3 个答案:

答案 0 :(得分:0)

检查您是否在同一个线程上访问jsonData。也许你在这里遇到了竞争条件。

答案 1 :(得分:0)

问题在于您不了解完成块的异步功能如何工作。

看看我对这个帖子的回答。我详细解释了发生了什么:

Why does Microsoft Azure (or Swift in general) fail to update a variable to return after a table query?

(不要让线程的标题误导你。它与Microsoft Azure无关。)

您正在使用的方法dataTaskWithRequest在URL会话的委托队列上调用您的完成闭包。除非您已将后台队列作为委托队列提供,否则无需使用dispatch_async。

答案 2 :(得分:0)

我找到了解决方案 let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT dispatch_async(dispatch_get_global_queue(priority,0)){self.jsonData = JSON(data:data)dispatch_async(dispatch_get_main_queue()){self.collectionView?reloadData()}}