Я знаком с шаблоном делегатов и обнулением своих делегатов, особенно когда делаю асинхронные вызовы, которые все еще выполняются, когда мои контроллеры представления исчезают. Я обнуляю делегата, и обратный вызов успешно возвращается для объекта с нулевым значением.
Сейчас я экспериментирую с использованием блоков завершения, чтобы немного облегчить чтение моего кода.
Я вызываю сетевую службу с моего контроллера представления и передаю блок, который обновляет мой UITableView. При нормальных обстоятельствах работает нормально. Однако, если я оставлю представление до его завершения, будет выполнен блок обработчика завершения - но теперь UITableView - зомби.
Каков обычный способ обращения с этим?
ОБНОВЛЕНИЕ С ОБРАЗЦОМ КОДА
Это приложение для iPad, у меня на экране одновременно два контроллера просмотра, например, разделенное представление. Одна - это деталь, а другая - сетка изображений. Я нажимаю на изображение, и оно сообщает детали, чтобы загрузить информацию. Однако, если я нажимаю на изображения слишком быстро, прежде чем они смогут выполнить сетевой вызов - у меня проблемы. При смене изображений вызывается приведенный ниже код, который считает фавориты изображения ....
Итак, вот моя дилемма, если я использую приведенный ниже код - он работает нормально, но он протекает в инструментах, если вы переключаете изображения до того, как сеть ответит.
Если я уберу __block и передам себя, то он падает с зомби.
Я не могу победить ... Я уверен, что упускаю что-то фундаментальное в использовании блоков.
__block UITableView *theTable = [self.table retain];
__block IndexedDictionary *tableData = [self.descriptionKeyValues retain];
FavouritesController *favourites = [Container controllerWithClass:FavouritesController.class];
[favourites countFavouritesForPhoto:self.photo
completion:^(int favesCount) {
[tableData insertObject:[NSString stringWithFormat:@"%i", favesCount]
forKey:@"Favourites:" atIndex:1];
[theTable reloadData];
[tableData release];
[theTable release];
}];
Есть советы? Спасибо
ВТОРОЕ ОБНОВЛЕНИЕ
Я изменил способ загрузки избранного. Вместо того, чтобы избранное было одиночным, я создаю экземпляр при каждом изменении фотографии. Заменив это и убив старый - блок не имеет возможности для обратного вызова (я полагаю, он даже не существует), и мой код теперь выглядит так, как показано ниже, и похоже, что он работает:
[self.favourites countFavouritesForPhoto:self.photo
completion:^(int favesCount) {
[self.descriptionKeyValues insertObject:[NSString stringWithFormat:@"%i", favesCount]
forKey:@"Favourites:" atIndex:1];
[self.table reloadData];
}];
Он не протекает и, похоже, тоже не падает.