如何以最有效的方式使用NSURLSession从服务器接收数据(服务器回显'它为JSON)?
示例:
我尝试使用Instagram的新闻Feed作为保存模板。它们显示10个图像,然后当你下拉时它将加载10个(来自服务器)并且不会阻止用户(他们在后台接收/下载它 - 而用户仍在使用应用程序)。
我想以最有效的方式做同样的事情。在我的示例中,屏幕被冻结,直到获取数据。如何避免阻止用户?
var imgurl = "http://www.joomlaworks.net/images/demos/galleries/abstract/7.jpg"
var sessionConfog = NSURLSessionConfiguration.defaultSessionConfiguration()
var sessions : NSURLSession = NSURLSession(configuration: sessionConfog, delegate: nil, delegateQueue: nil)
var getImageTask = sessions.downloadTaskWithURL(NSURL(string: imgurl)!, completionHandler: { (location : NSURL!, response : NSURLResponse!, error : NSError?) -> Void in
var image : UIImage = UIImage(data: NSData(contentsOfURL: location)!)!
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.iamgeview.image = image
let m = self.saveImage(image, path: self.documentsDirectory())
println(m)
})
})
getImageTask.resume()
答案 0 :(得分:0)
修改强>
我刚注意到,你没有正确使用NSURLSession!在完成块中,我看到了:
var image : UIImage = UIImage(data: NSData(contentsOfURL: location)!)!
不要这样做。 NSURLSession下载任务已经为您下载了数据,您不必使用方法'contentsOfURL'再次下载它。此方法也是同步的,并阻止调用线程,直到加载URL的内容。您永远不应该使用该方法来制作网络URL。
您需要做的是为下载任务实现委托方法,以便在完成时获取数据。更简单的方法是使用dataTaskWithURL:completionHandler - 对于该消息,完成处理程序从响应中接收NSData。
结束编辑
您正在使用NSURLSession,但如果您对应用程序进行概要分析,很可能您会看到此处最昂贵的操作,可能是阻止UI线程的操作:
let m = self.saveImage(image, path: self.documentsDirectory())
如果您可以将图像保存在单独的串行队列中,那么您将看到一个很大的改进。