URLSession.shared.dataTask 是 iOS 中用于进行网络请求的常用方法。dataTask 方法可以创建一个数据任务,从指定的 URL 获取数据。可以用它来获取 JSON、图片等网络资源。这里是一个简单的使用示例:
1、基本使用
dataTask 使用闭包(closure)处理请求的响应结果。基本步骤如下:
- 创建一个 URL 实例。
- 调用 URLSession.shared.dataTask。
- 在闭包中处理响应数据或错误。
- 启动任务。
2、示例代码
import Foundation
// 1. 创建URL
if let url = URL(string: "https://api.example.com/data") {
// 2. 创建数据任务
let task = URLSession.shared.dataTask(with: url) { data, response, error in
// 3. 检查是否有错误
if let error = error {
print("请求出错:\(error.localizedDescription)")
return
}
// 4. 检查响应数据
if let data = data {
// 将数据解析为字符串(例如 JSON)
if let jsonString = String(data: data, encoding: .utf8) {
print("响应数据:\(jsonString)")
}
}
}
// 5. 启动任务
task.resume()
}
3、代码解析
URLSession.shared.dataTask(with: url):创建一个数据任务,向指定 URL 发送请求。
{ data, response, error in … }:闭包负责处理请求的结果,data 是返回的数据,response 是响应对象,error 是可能的错误。
data:从服务器接收到的数据,类型为 Data?(可选类型)。如果请求成功且有数据返回,这里会包含服务器返回的数据,比如 JSON、HTML、图片等内容。
response:服务器的响应信息,类型为 URLResponse?(也是可选)。通常包含响应的 HTTP 状态码、头部信息等内容。可以将它强制转换为 HTTPURLResponse,从而获取更详细的信息。
error:请求过程中可能出现的错误,类型为 Error?。如果请求失败,error 会包含错误信息,否则为 nil。
task.resume():当我们创建了一个 URLSession 任务(如 dataTask、downloadTask 等)后,任务会在暂停状态,我们需要调用 resume() 才会真正开始执行任务。如果没有调用 resume(),请求不会发送,任务也不会执行。
4、处理 JSON 数据
如果要解析 JSON 数据,可以使用 JSONSerialization 或 Codable。
import Foundation
if let url = URL(string: "https://api.example.com/data") {
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
print("请求出错:\(error.localizedDescription)")
return
}
if let data = data {
do {
// 将数据解析为 JSON
let jsonObject = try JSONSerialization.jsonObject(with: data, options: [])
print("JSON 数据:\(jsonObject)")
} catch {
print("解析 JSON 出错:\(error.localizedDescription)")
}
}
}
task.resume()
}
JSONSerialization.jsonObject(with: data, options: []) 用于将网络请求返回的数据 data 解析为 JSON 格式的对象。
options:解析选项,类型为 JSONSerialization.ReadingOptions。可以用来配置解析行为。常用选项有:
mutableContainers:返回的 JSON 对象可以被修改(通常是 NSMutableDictionary 或 NSMutableArray)。
mutableLeaves:解析叶子节点为可变字符串(较少使用)。
fragmentsAllowed:允许解析不是顶层 JSON 对象的片段(iOS 13+ 支持)。
在代码中,options: [] 表示不使用任何特殊选项,默认返回不可变的 JSON 对象。
5、使用 Codable 解析 JSON
import Foundation
// 定义与 JSON 结构匹配的模型
struct MyDataModel: Codable {
let id: Int
let name: String
}
if let url = URL(string: "https://api.example.com/data") {
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
print("请求出错:\(error.localizedDescription)")
return
}
if let data = data {
do {
let decodedData = try JSONDecoder().decode(MyDataModel.self, from: data)
print("解析后的数据:\(decodedData)")
} catch {
print("解析出错:\(error.localizedDescription)")
}
}
}
task.resume()
}
URLSession.shared.dataTask(with:) 与 URLSession.shared.data(from:) 的区别
1、dataTask(with:):是异步方法,通常用于发送请求和获取数据。不会阻塞线程,更加常用。
let task = URLSession.shared.dataTask(with: url) { data, response, error in
// 处理响应
}
task.resume()
2、data(from:):同步方法,在需要数据立即返回的简单网络任务中偶尔使用,但由于其阻塞特性,限制了其广泛应用。