URLSession 的正确用法是什么,创建新的还是重用相同的

What's the correct usage of URLSession, create new one or reuse same one

我在 iOS 项目中使用 URLSession。 (Swift 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()
    }

}

我试图了解使用 URLSession 的最佳实践,即发出 HTTP 请求的每个函数调用是否应该创建一个新的 URLSession 还是应该创建一个全局的和所有的对 HTTP 请求的调用应该使用相同的 URLSession 实例?

我在网上学习过,有一个公认的答案说我应该 l , there is/are also suggestions that 。我对那些被接受但相互矛盾的答案感到困惑。有人可以为我澄清这个问题的正确答案吗?

我的应用程序没有上传或下载任务,只有具有 JSON 数据格式的纯 RESTful 请求。也不需要多种配置。

您应该创建一个数据会话的共享实例并使用相同的实例创建多个任务,因为您很少需要为 api.

使用不同的配置

我建议并使用数据会话的共享实例从 api 获取数据。

class MyTaskManager {

    static let sessionManager: URLSession = {
        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = 30 // seconds
        configuration.timeoutIntervalForResource = 30 // seconds
        return URLSession(configuration: configuration)
    }()

    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 请求再次初始化相同内容的过程。如果您需要更多自定义会话配置,这将更有帮助。

大多数时候,您应该使用一个会话来完成所有工作。这允许会话将同时请求限制到单个主机(限制意外滥用的可能性),并且比对每个请求使用新会话的内存效率要高得多。

如果您有多组任务需要一起取消(例如,上传新相册中的所有图片,下载加载单个网页的所有资源等),或者需要不同配置的多个请求(例如后台下载),那么每个组或配置使用一个会话是有意义的。

或者,如果您不需要对默认设置进行任何配置更改,并且对每个请求完成时 运行 一个块感到满意,您还可以使用共享会话([NSURLSession sharedSession]) 而不是创建会话。

-这取决于您对 URLSession 对象的使用。 - 如果您需要创建配置并分配代表,您将创建一个新的。 - 如果您既不更改配置也不设置委托,您将使用共享实例。

这部分也来自 Apple 文档中有关共享实例限制的内容:

共享会话有重要的限制: -您无法在数据从服务器到达时以增量方式获取数据。 -您无法显着自定义默认连接行为。 -您执行身份验证的能力是有限的。 - 当您的应用不是 运行.

时,您无法执行后台下载或上传