URLSession是iOS/macOS开发中用于网络请求的核心框架,它提供了一系列API来执行数据任务、上传任务和下载任务。从URL获取JSON数据是移动开发中常见的需求,通常用于与后端API交互。
guard let url = URL(string: "https://example.com/api/data") else {
print("Invalid URL")
return
}
let task = URLSession.shared.dataTask(with: url) { data, response, error in
// 处理响应
}
完整示例代码如下:
func fetchJSONData() {
// 1. 创建URL
guard let url = URL(string: "https://example.com/api/data") else {
print("Invalid URL")
return
}
// 2. 创建URLSession数据任务
let task = URLSession.shared.dataTask(with: url) { data, response, error in
// 3. 检查错误
if let error = error {
print("Error fetching data: \(error.localizedDescription)")
return
}
// 4. 检查HTTP响应状态码
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
print("Error with the response, unexpected status code: \(String(describing: response))")
return
}
// 5. 检查数据是否存在
guard let data = data else {
print("No data received")
return
}
// 6. 解析JSON数据
do {
let jsonObject = try JSONSerialization.jsonObject(with: data, options: [])
print("Received JSON data: \(jsonObject)")
// 如果知道具体的数据结构,可以进一步解码
// let decodedData = try JSONDecoder().decode(YourModel.self, from: data)
// print(decodedData)
} catch {
print("Failed to decode JSON: \(error.localizedDescription)")
}
}
// 7. 启动任务
task.resume()
}
问题:网络请求默认在后台线程执行,但UI更新必须在主线程进行。
解决:
DispatchQueue.main.async {
// 更新UI代码
}
问题:JSON数据结构复杂时解析困难。
解决:使用Codable协议定义模型
struct User: Codable {
let id: Int
let name: String
let email: String
}
do {
let user = try JSONDecoder().decode(User.self, from: data)
print(user)
} catch {
print("Decoding error: \(error)")
}
问题:默认超时时间可能不足。
解决:自定义URLSession配置
let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = 30 // 30秒超时
let session = URLSession(configuration: config)
问题:在闭包中引用self可能导致内存泄漏。
解决:使用weak self
let task = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in
guard let self = self else { return }
// 处理代码
}
var request = URLRequest(url: url)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer token123", forHTTPHeaderField: "Authorization")
let task = URLSession.shared.dataTask(with: request) { data, response, error in
// 处理响应
}
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let body: [String: Any] = ["username": "user1", "password": "pass123"]
request.httpBody = try? JSONSerialization.data(withJSONObject: body)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
// 处理响应
}
URLSession是iOS开发中处理网络请求的强大工具,掌握它可以高效地实现各种网络数据交互需求。