Swift 网络请求方法URLSession.shared.dataTask
Swift 网络请求方法URLSession.shared.dataTask

Swift 网络请求方法URLSession.shared.dataTask

URLSession.shared.dataTask 是 iOS 中用于进行网络请求的常用方法。dataTask 方法可以创建一个数据任务,从指定的 URL 获取数据。可以用它来获取 JSON、图片等网络资源。这里是一个简单的使用示例:

1、基本使用

dataTask 使用闭包(closure)处理请求的响应结果。基本步骤如下:

  1. 创建一个 URL 实例。
  2. 调用 URLSession.shared.dataTask。
  3. 在闭包中处理响应数据或错误。
  4. 启动任务。

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:):同步方法,在需要数据立即返回的简单网络任务中偶尔使用,但由于其阻塞特性,限制了其广泛应用。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注