Один из шаблонов, представленных на конференции WWDC 2010 «Blocks and Grand Central Dispatch», заключался в использовании вложенных вызовов 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» блока является последним вызовом выпуска (например, пользователь уходит из представления во время выполнения фоновой задачи), вызывается метод dealloc myViewController, но он вызывается в фоновом потоке !!
Объекты UIKit не любят, когда их выделяют вне основного потока. В моем случае UIWebView выдает исключение.
Как может этот шаблон, представленный WWDC, специально упомянутый как лучший новый способ избежать блокировки пользовательского интерфейса, быть настолько ошибочным? Я что-то упускаю?