
1) 【一句话结论】:采用URLSession TaskGroup管理并发请求,通过控制并发任务数量、设置动态超时,并处理相同资源并发冲突,实现高效加载且避免请求冲突或超时。
2) 【原理/概念讲解】:老师口吻,解释URLSession并发机制。系统提供TaskGroup来管理多个并发任务,我们可以通过配置concurrentTaskCount限制同时运行的任务数,防止资源耗尽(如最多3个任务同时运行)。对于相同资源(如同一候选人ID的多次请求),使用taskIdentifier标识任务,避免重复请求或冲突。超时时间需结合网络环境(如移动网络下增加超时时间)和数据量(大数据请求延长超时)动态调整。类比:任务组像交通调度中心,控制同时出发的车辆(任务)数量,每辆车(任务)有行驶时间限制(超时),若超时则返回并通知调度中心,其他车辆继续行驶,最终所有车辆到达后统一处理货物(数据)。
3) 【对比与适用场景】:
| 方法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 串行请求 | 依次执行每个网络请求 | 顺序执行,无并发 | 数据依赖强(如先加载职位再加载候选人) | 延迟高,效率低 |
| 并发请求(原生:GCD+URLSession) | 利用URLSession TaskGroup管理并发任务,控制并发数量 | 高效利用网络带宽,支持超时/错误处理 | 多个独立数据(候选人、职位、个人中心) | 需手动控制并发数量,避免资源耗尽 |
| 并发请求(第三方库:如Alamofire) | 库封装的并发管理,提供更易用的API | 内置超时、错误处理,高级并发控制 | 需求复杂,需精细控制 | 依赖第三方库,增加项目复杂度 |
4) 【示例】:
// 假设数据源URL
let candidateURL = URL(string: "https://api.example.com/candidates")!
let jobURL = URL(string: "https://api.example.com/jobs")!
let profileURL = URL(string: "https://api.example.com/profile")!
// 创建TaskGroup,控制并发数量(如最多3个任务同时运行)
let group = URLSession.shared.newTaskGroup()
group.maxConcurrentTaskCount = 3 // 控制并发数量
// 添加任务
group.addTask { [weak self] in
let task = URLSession.shared.dataTask(with: candidateURL) { data, response, error in
if let error = error {
print("候选人请求超时/失败: \(error)")
return
}
// 处理候选人数据
}
task.resume()
}
group.addTask { [weak self] in
let task = URLSession.shared.dataTask(with: jobURL) { data, response, error in
if let error = error {
print("职位请求超时/失败: \(error)")
return
}
// 处理职位数据
}
task.resume()
}
group.addTask { [weak self] in
let task = URLSession.shared.dataTask(with: profileURL) { data, response, error in
if let error = error {
print("个人中心请求超时/失败: \(error)")
return
}
// 处理个人中心数据
}
task.resume()
}
// 等待所有任务完成
group.wait(for: [candidateURL, jobURL, profileURL]) { errors in
if let errors = errors {
print("部分任务失败: \(errors)")
} else {
print("所有任务完成,合并数据更新UI")
}
}
5) 【面试口播版答案】:面试官您好,对于招聘管理系统中同时加载多个数据(候选人列表、职位列表、个人中心信息),我会采用URLSession TaskGroup方案。核心是通过TaskGroup管理并发任务,控制同时运行的数量(比如最多3个任务),每个任务独立设置超时(根据网络环境动态调整,如移动网络下延长超时),并处理相同资源并发冲突(用taskIdentifier避免重复请求)。这样即使某个请求超时或失败,其他请求也能继续,最终所有任务完成后统一更新UI,提升加载效率。具体来说,我会创建TaskGroup,添加每个数据源的请求任务,设置并发数量限制,超时后取消任务并提示用户,确保资源不被耗尽,同时通过回调收集结果,保证数据加载的一致性。
6) 【追问清单】:
concurrentTaskCount属性或TaskGroup的maxConcurrentTaskCount参数,根据设备性能和网络状况设置合理的并发数(如3-5个)。taskIdentifier,通过URLSession的taskIdentifier属性判断是否为重复请求,避免重复发送相同资源请求。7) 【常见坑/雷区】: