Представьте себе ситуацию, когда вы хотите асинхронно загружать текст с сервера и отображать результат в 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.) Нужно ли использовать [слабое я] в закрытии, используемом для асинхронных вызовов?
Я думал, что мне нужно, но я не уверен, что после того, как я прочитал Q/A здесь, в StackOverflow, и прошел довольно много приложений с открытым исходным кодом, которые не используют [слабое я] для асинхронных задач + закрытий.
то есть:.
Единственный раз, когда вы действительно хотите использовать [unowned self] или [слабый self], когда вы создадите сильный ссылочный цикл. (Должны ли мы всегда использовать [unowned self] внутри закрытия в Swift)
В моем случае нет сильного ссылочного цикла.
или
Но, чтобы быть ясным, было бы лучше использовать сильную ссылку в это обстоятельство. (Swift ARC и блоки)
B.) Скажем, хорошо идти с сильной ссылкой. Что происходит с ViewController, когда пользователь переходит на другую страницу в середине загрузки async? Будет ли поддерживать невидимый ViewController в памяти приложения до завершения задачи async?