迅速closures和asynchronous任务

想象一种情况,当你想从服务器asynchronous加载一些文本,并将结果显示在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.)我是否需要在用于asynchronous调用的closures中使用[weak self]?

我以为我需要,但是我不确定在StackOverflow上阅读了一些Q / A后,经过了一些不使用[weak self]进行asynchronous任务+闭包的开源应用程序。

即:

你唯一想要使用[无主自我]或者[弱自我]的时候就是创造一个强大的参考周期。 ( 我们总是在Swift中使用封闭的[unowned self] )

在我的情况下没有强大的参考周期。

要么:

但要说清楚的是,在这种情况下,最好还是用一个强有力的参照。 ( Swift ARC和块 )

B.)让我们说,这是强有力的参考。 当用户导航到asynchronous加载中的不同页面时,ViewController会发生什么? 它会保持不可见的ViewController在应用程序的内存,直到asynchronous任务完成?

这里没有强大的参考周期(保留周期)。 如果您对self使用强引用,则在分派块运行后立即解决。 如果您需要,您理论上可以在这里使用强大的参考。

话虽如此,我会build议在这种情况下使用一个弱引用。 仅仅为了更新已经被解雇的视图的文本字段,在耗时的过程中保持强有力的参考是没有意义的。 如果你正在更新其他模型对象或类似的东西,也许你可能需要保留强大的引用,但在这种情况下你不需要这样做。 作为一般原则,应尽快合理地释放记忆。

更好的是,我还要看看“长时间运行的asynchronous操作”,并决定在视图控制器被解散后是否真的希望它继续运行。 如果没有,我会倾向于使请求取消,然后取消请求。 而且,在这种情况下,你一定要使用弱引用(否则deinit将不会被调用,直到长时间运行的asynchronous操作完成)。