URLSession最佳实践 - 多个请求

时间:2017-01-11 20:49:47

标签: ios macos nsurlsession foundation

我需要对URLSession/NSURLSession的最佳做法提供一些指导。

我的要求规定我必须执行adhoc / periodic HTTP GET请求。即每隔几分钟,然后可能每30秒,随意改变。

无论如何,我已经实现了如下所示,我有一个包含这样的代码的方法:

 let urlRequest = URLRequest(url: url)

        // set up the session
        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config)
        // make the request
        let task = session.dataTask(with: urlRequest, completionHandler: { (data, response, error) in ...

这使得URLSession保持在此方法的范围内。

所以有些问题:

1)这是正确的方式来实现我正在寻找的东西,或者我应该在类级范围内拥有URLSession并创建多个任务&#39 ;? - 如果是这样我应该在每项任务上打电话给.resume?

2)如果这是一个可接受的URLSession使用范例,我是否会泄漏内存(请不要用ARC思考)?我问,因为我注意到URLSession对象似乎停留在我每次调用/替换它的方法范围之外。 (我通过对我定期检查的对象的弱引用来检查这个... ...

3)是否有一种更简洁的方法来使用URLSession在adhoc基础上请求相同的URL?我觉得NSURLConnection处理得很好,但已经弃用了。

1 个答案:

答案 0 :(得分:3)

1)这是实现我正在寻找的正确方法,还是我应该在类级别范围内拥有URLSession并创建多个“任务”? - 如果是这样,我应该在每项任务上调用.resume吗?

答案: 你所做的并不是错误的,尽管这种情况并不常见。 最佳做法是使用URLSession的共享实例。为您正在进行的每个请求(通常每30秒)创建一个新的会话配置和URLSession对象,其效果将低于使用单例。

2)如果这是一个可接受的URLSession使用范例我是否会泄漏内存(请不要这么认为是使用ARC)?我问,因为我注意到URLSession对象似乎停留在我称之为/每次替换它的方法范围之外。 (我通过对我定期检查的对象的弱引用来检查这一点)......

答案: 您可能会注意到您的URLSession对象超出了方法调用范围的原因是您正在向它传递一个转义闭包,并且会话可能会一直存在,直到调用完成处理程序。

3)是否有一种更简洁的方法来使用URLSession在adhoc基础上请求相同的URL?我觉得NSURLConnection处理得很好但是已经弃用了。

回答:有很多方法可以实现这一目标。您可以尝试存储对URL或请求的引用,并使用您希望的相同请求调用您的方法。