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