URLSession的正确用法是什么?创建新的URLSession或重用同一URL

时间:2018-10-01 13:06:56

标签: ios nsurlsession

我在我的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请求。也不需要多个配置。

3 个答案:

答案 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文档中有关共享实例限制的这部分内容:

共享会话具有重要限制:  -当数据从服务器到达时,您无法增量获取。  -您无法自定义默认的连接行为。  -您执行身份验证的能力受到限制。  -当您的应用未运行时,您将无法执行后台下载或上传。