我需要对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处理得很好,但已经弃用了。
答案 0 :(得分:3)
1)这是实现我正在寻找的正确方法,还是我应该在类级别范围内拥有URLSession并创建多个“任务”? - 如果是这样,我应该在每项任务上调用.resume吗?
答案: 你所做的并不是错误的,尽管这种情况并不常见。 最佳做法是使用URLSession的共享实例。为您正在进行的每个请求(通常每30秒)创建一个新的会话配置和URLSession对象,其效果将低于使用单例。
2)如果这是一个可接受的URLSession使用范例我是否会泄漏内存(请不要这么认为是使用ARC)?我问,因为我注意到URLSession对象似乎停留在我称之为/每次替换它的方法范围之外。 (我通过对我定期检查的对象的弱引用来检查这一点)......
答案: 您可能会注意到您的URLSession对象超出了方法调用范围的原因是您正在向它传递一个转义闭包,并且会话可能会一直存在,直到调用完成处理程序。
3)是否有一种更简洁的方法来使用URLSession在adhoc基础上请求相同的URL?我觉得NSURLConnection处理得很好但是已经弃用了。
回答:有很多方法可以实现这一目标。您可以尝试存储对URL或请求的引用,并使用您希望的相同请求调用您的方法。