【发布时间】:2015-02-23 10:02:35
【问题描述】:
我最近使用 Swift 开发了一个 iOS 应用程序,它处理大量后台 HTTP 任务,不仅更新 UI,还根据响应数据更新当前会话的静态数据(大量数组、变量等)。我在 iOS 开发中可能算得上是新人,有几点我很困惑:
从后台任务更新 UI 是通过 GCD API 处理的。我一直使用以下方法处理这些更新:
dispatch_async(dispatch_get_main_queue, {
// Update UI
})
让我给出一个场景并澄清我的观点:
我有一个带有 UITableView 子视图的视图控制器。这个表视图将显示一些东西的列表(比如说用户名)。我准备并恢复了一个 NSURLSessionDataTask:
let request = NSMutableURLRequest(URL: someURL)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
// Handle error case
// Parse data, and receive a user list
// AppData.userList = parsed list
// Update table view
}
我的一些测试人员遇到了一些与调度调用和运行循环相关的崩溃,我无法找到背后的原因。我认为这与我的调度呼叫有关。现在我正在重新考虑我的设计,这是我的问题:
- 在 http 任务的完成处理程序中,在主队列上的 dispatch_async 调用内部和外部更新静态数据(数组、字典等)有什么区别(UI 无论如何都会在调度调用内部更新,在更新之后在我的数据上)?如何在读取、插入或删除数组时确保后台线程的线程安全?
- 在闭包内进行 dispatch_async 调用(用于任务完成处理程序)是否会导致任何问题?
任何明确的评论或指导都会非常有帮助!现在已经非常感谢了
【问题讨论】:
标签: ios asynchronous nsurlsessiondatatask