• iOS开发:你知道URLSession的用法吗?
  • 发布于 2个月前
  • 108 热度
    0 评论
前言
在 iOS 开发中,网络请求是一个非常常见的需求。无论是获取远程数据、上传文件,还是下载内容,我们都需要一个强大而灵活的网络处理框架。在实际项目中,我们通常用比较成熟的框架来实现网络请求,在 OC 时代,我们常用的网络库是 AFNetworking,在 Swift 中我们常用的网络库为 Alamofire,他们的底层都是系统库 NSURLSession,因为用习惯了第三方框架,导致大部分 iOS 开发都对 URLSession 不太熟悉,我准备做一系列文章来介绍 URLSession,看完这个系列之后,你也能自己实现一个 Alamofire 或者 AFNetworking 了。

今天是系列的第一篇,我们先来了解一下 URLSession 的基本使用。

URLSession 是什么?
URLSession 是 Apple 提供的用于处理 HTTP/HTTPS 请求的 API。它支持多种网络任务,包括:
1.数据任务(Data tasks):发送和接收数据,如 GET 或 POST 请求。
2.下载任务(Download tasks):下载文件。
3.上传任务(Upload tasks):上传文件。

4.流任务(Stream tasks):处理流数据。


URLSession 提供了同步和异步两种方式来处理网络请求,并支持后台传输、取消和恢复传输等高级功能。

URLSession 的使用
URLSession 实例
有两种方法:
1.URLSession.shared:大多数情况直接使用这个共享的单例就行了
2.URLSession(configuration: URLSessionConfiguration):自定义配置的 URLSession,如果你有特殊需求,可以使用这个方法创建一个新的 URLSession


URLSessionConfiguration

URLSessionConfiguration 是 URLSession 的配置类,用于配置 URLSession 的行为,比如超时时间、缓存策略、代理设置等等。
这些配置项非常强大,看一个比较完整的实例:
// 默认配置
let configuration = URLSessionConfiguration.default 
// 超时时间
configuration.timeoutIntervalForRequest = 15 
configuration.timeoutIntervalForResource = 15 
// 缓存策略
configuration.requestCachePolicy = .useProtocolCachePolicy 
// 请求头
configuration.httpAdditionalHeaders = ["Content-Type": "application/json"] 
// 是否允许蜂窝网络访问
configuration.allowsCellularAccess = true 
// 每个主机的最大连接数
configuration.httpMaximumConnectionsPerHost = 5 
// 是否等待网络连接
configuration.waitsForConnectivity = true
// 任务标识符
configuration.identifier = "com.example.app" 
// 网络服务类型
configuration.networkServiceType = .default 
// 是否等待网络连接
configuration.waitsForConnectivity = true 

// 创建 URLSession
let session = URLSession(configuration: configuration)
URLSessionDataTask
Data tasks 是 URLSession 的一种任务类型,用于发送和接收数据。我们可以通过 URLSession 的 dataTask(with:completionHandler:) 方法创建一个请求任务,然后通过 resume() 方法启动任务。
let url = URL(string: "https://api.github.com")!
let session = URLSession.shared
let task = session.dataTask(with: url) { data, response, error in
    if let error = error {
        print("请求出错 Error: \(error)")
        return
    }
    if let response = response as? HTTPURLResponse {
        print("状态码为: \(response.statusCode)")
    }
    if let data = data {
        let str = String(data: data, encoding: .utf8)
        print("请求 Response: \(str ?? "")")
    }
}
task.resume()
这段代码创建了一个简单的 GET 请求,请求 GitHub 的 API,然后输出了响应的状态码和内容。这样就完成了一个简单的网络请求,是不是很简单呢?

URLSessionUploadTask
Upload tasks 是 URLSession 的另一种任务类型,可以轻松用它来上传文件。我们可以通过 URLSession 的 uploadTask(with:from:completionHandler:) 方法创建一个上传任务,然后通过 resume() 方法启动任务。
使用方法和 Data tasks 类似,只是多了一个上传文件的参数:
let url = URL(string: "https://api.github.com")!
let session = URLSession.shared
let fileURL = URL(fileURLWithPath: "path/to/file") // 上传文件的路径
let task = session.uploadTask(with: URLRequest(url: fileURL), fromFile: fileURL) { data, response, error in
    if let error = error {
        print("请求出错 Error: \(error)")
        return
    }
    if let response = response as? HTTPURLResponse {
        print("状态码为: \(response.statusCode)")
    }
    if let data = data {
        let str = String(data: data, encoding: .utf8)
        print("请求 Response: \(str ?? "")")
    }
}
task.resume()
URLSessionDownloadTask
Download tasks 是 URLSession 用它来下载文件的,当你要下载一个文件时可以使用,它允许你将文件下载并保存到本地。我们可以通过 URLSession 的 downloadTask(with:completionHandler:) 方法创建一个下载任务,然后通过 resume() 方法启动任务。
let url = URL(string: "https://api.github.com/xxx.json")!
let session = URLSession.shared
let task = session.downloadTask(with: url) { location, response, error in
    if let error = error {
        print("请求出错 Error: \(error)")
        return
    }
    if let response = response as? HTTPURLResponse {
        print("状态码为: \(response.statusCode)")
    }
    if let location = location {
        let str = try? String(contentsOf: location)
        // 保存在本地
        let fileManager = FileManager.default
        let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
        let destinationURL = documentsURL.appendingPathComponent("downloadedFile")
        try? fileManager.moveItem(at: location, to: destinationURL)
    }
}
task.resume()
管理会话
会话是 URLSession 的核心,它负责处理所有的网络请求,除了上边用到的以下方法。
以下是一些会话常用的方法:
invalidateAndCancel():取消所有任务并使会话无效。
finishTasksAndInvalidate():等待所有任务完成后使会话无效。
getAllTasks(completionHandler:):获取所有任务。
flush(completionHandler:):清空缓存。

reset(completionHandler:):重置整个会话。


任务生命周期管理
每个任务都有自己的生命周期,URLSession 提供了一些方法来管理任务的生命周期:
resume():启动任务,上边的代码中都有用到。
suspend():暂停任务,暂停后可以通过 resume() 方法重新启动。

cancel():取消任务,取消后无法恢复,比如当用户离开这个页面的时候,可以把当前页面的网络请求取消,避免资源浪费。


总结
今天我们了解了 URLSession 的基本使用,包括 URLSession 的实例、配置、Data tasks、Upload tasks、Download tasks、会话管理、任务生命周期管理等。
用户评论