
1) 【一句话结论】采用主线程与子线程分离模式,通过异步队列(如全局并发队列)执行网络请求,利用线程安全机制(如DispatchQueue同步/串行队列)保证数据一致性,响应速度通过缓存、预加载优化,错误处理分层(网络层、业务层)实现,确保UI响应流畅且数据可靠。
2) 【原理/概念讲解】
首先,iOS应用中UI更新必须在主线程,所以网络请求(耗时操作)需在子线程执行,避免阻塞UI。线程安全是为了防止多线程同时访问共享资源(如缓存、数据模型)导致数据不一致。响应速度优化核心是减少请求延迟和重复请求,比如缓存有效数据、预加载热门关卡配置。错误处理需分层:网络层处理连接失败、超时;业务层处理服务器返回错误(如参数错误、权限问题),避免直接暴露底层错误给用户。
类比:想象网络请求像快递,主线程是前台收快递的人(必须在线),子线程是快递员(后台取快递),快递员取到快递后,把包裹(数据)送到前台(主线程)更新状态(UI),这样不会让收快递的人等太久。
3) 【对比与适用场景】
| 方案 | 定义 | 线程安全处理 | 响应速度 | 适用场景 |
|---|---|---|---|---|
| 主线程同步请求 | 在主线程直接发起网络请求 | 无需额外线程安全,但会阻塞UI | 极慢(阻塞主线程) | 测试环境、简单单次请求(不推荐) |
| 异步队列(全局并发队列) | 使用DispatchQueue.global(qos: .userInitiated)并发执行请求 | 需要手动同步访问共享资源(如缓存) | 快(并发执行) | 大量并发请求(如排行榜实时更新) |
| 自定义串行队列 | 使用DispatchQueue.concurrent/serial队列,按顺序执行 | 队列内部线程安全,适合顺序依赖操作 | 中等(串行) | 依赖顺序的请求(如先获取关卡配置,再加载关卡) |
| 网络层+业务层错误处理 | 分层处理错误,网络层捕获连接/超时,业务层处理业务逻辑错误 | 各层独立处理,减少错误传播 | 高(快速定位错误) | 复杂业务逻辑,需精准错误反馈 |
4) 【示例】
伪代码(使用URLSession + DispatchQueue):
// 定义全局并发队列
let networkQueue = DispatchQueue.global(qos: .userInitiated)
// 获取关卡配置
func fetchLevelConfig(levelId: Int, completion: @escaping (Result<[Level], Error>) -> Void) {
networkQueue.async {
guard let url = URL(string: "https://api.9377.com/levels/\(levelId)") else {
completion(.failure(NSError(domain: "Invalid URL", code: -1, userInfo: nil)))
return
}
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
completion(.failure(error))
return
}
guard let data = data else {
completion(.failure(NSError(domain: "No data received", code: -2, userInfo: nil)))
return
}
do {
let levels = try JSONDecoder().decode([Level].self, from: data)
completion(.success(levels))
} catch {
completion(.failure(error))
}
}
task.resume()
}
}
// 获取排行榜数据
func fetchLeaderboard(completion: @escaping (Result<[Player], Error>) -> Void) {
networkQueue.async {
let url = URL(string: "https://api.9377.com/leaderboard")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
// 错误处理逻辑同上
// 解析数据
// 发送回主线程更新UI
DispatchQueue.main.async {
completion(.success(players))
}
}
task.resume()
}
}
说明:网络请求在全局并发队列执行,避免阻塞主线程;数据解析和UI更新在主线程完成,保证线程安全;错误处理分网络错误(如连接失败)和解析错误(如JSON格式错误)。
5) 【面试口播版答案】
“面试官您好,关于异步网络请求的处理,核心思路是主线程与子线程分离,通过异步队列执行网络操作,同时兼顾线程安全、响应速度和错误处理。具体来说:
6) 【追问清单】
7) 【常见坑/雷区】