使用NSURLSession在后台从服务器接收数据的最佳实践(不在主要方面)

时间:2015-03-31 22:55:10

标签: objective-c swift nsdata nsurlrequest nsurlsession

如何以最有效的方式使用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()

1 个答案:

答案 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())

如果您可以将图像保存在单独的串行队列中,那么您将看到一个很大的改进。