Вы могли бы реализовать его, как следующее:
- (IBAction)updateDatabase:(id)sender {
__block MyController* blockSelf = self;
__weak MyController* weakSelf = self;
[self startBusyIndicator];
[self asyncDownloadDatabase:^(id result, NSError*error) {
if (error == nil) {
[blockSelf.database updateWithData:result];
}
blockSelf = nil;
MyController* strongSelf = weakSelf;
if (strongSelf) {
dispatch_async(dispatch_get_main_queue(), ^{
[strongSelf reloadData];
[strongSelf stopBusyIndicator];
});
}
}];
}
Использование blockSelf
гарантирует, что контроллер не оставлял в живых до тех пор, после того, как asyncDownloadDatabase
закончена, и база данных обновляется. Предполагается, что процесс обновления может быть выполнен в любом потоке.
weakSelf
будет только нулевым и немедленно до тех пор, пока blockSelf не будет установлен на nil, если это последняя ссылка на контроллер - например, пользователь переключился на другое представление. В этом случае никакие представления не будут обновлены - они уже освобождены. В противном случае, если контроллер все еще существует, представления будут обновляться.
Я бы не использовал уведомления. Блоки и диспетчер lib обеспечивают гораздо более четкий подход. См. Мой ответ. – CouchDeveloper