Один из шаблонов, представленных на конференции WWDC 2010 "Блоки и грандиозная центральная диспетчерская связь", заключался в использовании вложенных вызовов dispatch_async для выполнения трудоемких задач в фоновом потоке и затем обновления пользовательского интерфейса в основном потоке после завершения задачи
dispatch_async(backgroundQueue, ^{
// do something time consuming in background
NSArray *results = ComputeBigKnarlyThingThatWouldBlockForAWhile();
// use results on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
[myViewController UpdateUiWithResults:results];
});
});
Так как "myViewController" используется внутри блоков, он автоматически получает "сохранить" и позже получит "release", когда блоки будут очищены.
Если вызов блока "release" является окончательным вызовом освобождения (например, пользователь перемещается в сторону от представления во время выполнения фоновой задачи) вызывается метод dealloc myViewController, но он вызывает фоновый поток!
Объекты UIKit не любят быть выделенными вне основного потока. В моем случае UIWebView выдает исключение.
Как этот WWDC может представить шаблон, который конкретно упоминается как лучший новый способ избежать блокировки пользовательского интерфейса - быть настолько ошибочным? Я что-то упускаю?