К сожалению, вы не можешь остановить исполнение НОДА, но есть еще способы исправить эту ошибку. Поскольку основным вопросом в этом потоке является остановка выполнения, я отправлю решение на основе того, что вы просите, используя NSOperation.
1- Создать NSOperationQueue
NSOperationQueue *_myQueue;
_myQueue = [NSOperationQueue new];
_myQueue.name = @"com.my.queue";
2- Обновить таблицу из очереди. (Я буду использовать блоки в порядке?)
[_myQueue addOperationWithBlock:^{
//your really expensive function
//and your table reload call
[tableView reloadData];
}];
3- Теперь вы можете отменить выполнение с помощью
//maybe you will want to do this on viewDidDisappear
[_myQueue cancelAllOperations];
Update:
Опа, я увидел, что вы задерживаете таблицы перезагрузки вызова, но NSOperation не имеет механизма задержки. Чтобы решить эту проблему можно смоделировать задержку с помощью
[NSThread sleepForTimeInterval:1.5];
перед вызовом [tableView reloadData];
внутри addOperationWithBlock:
или продолжать использовать ГКД, как вы делаете сейчас, и изменение ссылки на Tableview, чтобы weak
, чтобы избежать блока сохранения вашего объекта Tableview, как это :
__weak __typeof__(tableView) weakTable = tableView;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
//Now, if your table object was released at this point, the reloadData
//will be ignored
[weakTable reloadData];
});
Надеюсь, что это поможет ...
Где и когда вы называете этот метод GCD? – Leo
in my '- (void) tableView: (UITableView *) tableView willDisplayCell: (UITableViewCell *) cell forRowAtIndexPath: (NSIndexPath *) indexPath', пожалуйста, не спрашивайте, почему, его длинный рассказ –
Здесь есть намек на запах кода, но, как вы просили нас не спрашивать, я не буду. Но в нижней строке, если вы хотите отменить что-то, происходящее через 1,5 секунды, вероятно, лучше использовать 'NSTimer' (который вы можете легко отменить, вызвав' invalidate' на объект таймера), а не 'dispatch_after'. – Rob