我在我的iOS项目中使用URLSession。 (快速4)。以下代码仅用于说明目的。
class MyTaskManager {
...
func postMyData(...) {
let defaultSession = URLSession(configuration: .default)
dataTask = defaultSession.dataTask(with: url) { data, response, error in
...
}
dataTask.resume()
}
func getMyData(...) {
let defaultSession = URLSession(configuration: .default)
dataTask = defaultSession.dataTask(with: url) { data, response, error in
...
}
dataTask.resume()
}
}
从每个发出HTTP请求的函数调用是否应该创建一个新的URLSession
还是应该创建一个全局调用和所有调用的意义上,我试图了解使用URLSession
的最佳实践HTTP请求应该使用相同的URLSession
实例?
我在互联网上学习,有一个可接受的答案说我应该create a new URLSession for each function/request cal l,也有关于I should reuse the same URLSession的建议。我对那些被接受但矛盾的答案感到困惑。有人可以为我澄清这个问题的正确答案吗?
我的应用程序没有上传或下载任务,只有JSON数据格式的纯RESTful请求。也不需要多个配置。
答案 0 :(得分:2)
您应该创建数据会话的共享实例,并使用同一实例创建多个任务,因为很少需要为api配置不同的配置。
我建议并使用数据会话的共享实例从api获取数据。
class MyTaskManager {
static let sessionManager: URLSession = {
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 30 // seconds
configuration.timeoutIntervalForResource = 30 // seconds
return URLSession(configuration: .default)
}()
func postMyData(...) {
dataTask = sessionManager.dataTask(with: url) { data, response, error in
...
}
dataTask.resume()
}
func getMyData(...) {
dataTask = sessionManager.dataTask(with: url) { data, response, error in
...
}
dataTask.resume()
}
}
这样做的好处是我只需要创建一次会话,这样就可以节省重复相同的代码,以及每个api请求再次初始化相同内容的过程。如果您需要对会话进行更多自定义配置,这将更加有用。
答案 1 :(得分:1)
大多数时候,您应该使用一个会话进行所有工作。这样一来,会话可以将同时进行的请求限制在一个主机上(从而限制了意外滥用的可能性),并且与为每个请求使用一个新的会话相比,其内存效率也要高得多。
如果需要将多个任务组作为一个组取消(例如,上载新相册中的所有图像,下载用于加载单个网页的所有资源等),则它将每组只能使用一个会话。
或者,如果您不需要对默认配置进行任何更改,并且对每个请求完成后只运行一个块感到满意,那么您也可以使用共享会话([NSURLSession sharedSession]
)而不是创建一个会话。
答案 2 :(得分:0)
-这取决于您对URLSession对象的使用。 -如果需要创建配置并分配委托,您将创建一个新的代理。 -如果您既不更改配置也不设置委托,则将使用共享实例。
Apple文档中有关共享实例限制的这部分内容:
共享会话具有重要限制: -当数据从服务器到达时,您无法增量获取。 -您无法自定义默认的连接行为。 -您执行身份验证的能力受到限制。 -当您的应用未运行时,您将无法执行后台下载或上传。