URLSession 介绍

Thursday, April 26, 2018

我们之前介绍了 Moya 和 Alamofire,今天我们就再深入一点,看看系统的 URLSession是怎么详细使用的

URLSession

URLSession 主要负责请求和接收 HTTP 请求,通过 URLSessionConfiguration 来创建URLSession

有三种类型:

  • default:创建一个使用磁盘存储的全局缓存,凭证和 cookie 使用默认配置
  • ephemeral: 与 default 类似,但是使用内存存储
  • background: 让会话在后台执行下载或者上传

URLSessionConfiguration 还允许你配置会话属性,例如超时的时间,缓存策略和 HTTP 请求头

URLSessionTask 是一个表示任务对象的抽象层,会话创建一个或者多个任务来执行提取数据和下载或上传文件的实际工作。

有三种 URLSessionTask

  • URLSessionDataTask: 使用 HTTP 请求获取数据
  • URLSessionUploadTask: 从磁盘中上传文件
  • URLSessionDownloadTask: 从服务器下载文件到临时存储区

** URLSession ** 返回数据有两种形式,一种是通过 block 的形似,一种是通过 delegate 的的形式。

Data Task

  • 我们现在简单创建一个网络请求

    // 创建 urlsession
       
    let defaultSession = URLSession(configuration: .default)
        
    // 声明 urlsessiondatatask 变量
    var dataTask: URLSessionDataTask?
        
        
    func getSearchResults(searchTerm: String, completion: @escaping QueryResult) {
      // 对于准备进行的新的请求,应该讲已存在的请求先取消掉
      dataTask?.cancel()
      // 通过 urlComponents 来创建请求 URL
      if var urlComponents = URLComponents(string: "https://itunes.apple.com/search") {
        urlComponents.query = "media=music&entity=song&term=\(searchTerm)"
        // 
        guard let url = urlComponents.url else { return }
        // 执行请求
        dataTask = defaultSession.dataTask(with: url) { data, response, error in
          defer { self.dataTask = nil }
          // 5
          if let error = error {
            self.errorMessage += "DataTask error: " + error.localizedDescription + "\n"
          } else if let data = data,
            let response = response as? HTTPURLResponse,
            response.statusCode == 200 {
            self.updateSearchResults(data)
            // 6
            DispatchQueue.main.async {
              completion(self.tracks, self.errorMessage)
            }
          }
        }
        // 7
        dataTask?.resume()
      }
    }
        
    
iOSSwift

变动

Alamofire 用法(二)