【发布时间】:2015-09-04 09:35:45
【问题描述】:
想象一种情况,当您想要异步从服务器加载一些文本并将结果显示在 ViewController's UITextField。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
//... some long running async operation
if let textResponse = responseFromServer {
dispatch_async(dispatch_get_main_queue(), { [weak self] () in
self?.textField.text = textResponse
})
}
})
A.) 我需要在用于异步调用的闭包中使用 [weak self] 吗?
我认为我需要这样做,但在阅读了 StackOverflow 上的一些 Q/A 并浏览了很多不使用 [weak self] 进行异步任务 + 闭包的开源应用程序之后,我不确定。
即:
你真正想要使用 [unowned self] 或 [weak self] 是您创建强参考循环的时候。 (Shall we always use [unowned self] inside closure in Swift)
在我的例子中没有强引用循环。
或:
但要明确一点,最好还是使用强引用 这种情况。 (Swift ARC and blocks)
B.) 假设使用强参考很好。 当用户在异步加载过程中导航到不同的页面时,ViewController 会发生什么?它会在异步任务完成之前将不可见的 ViewController 保留在应用内存中吗?
【问题讨论】:
标签: ios swift asynchronous closures