Niestety, nie można zatrzymać wykonywanie GCD, ale jest inny sposoby napraw ten błąd. Ponieważ głównym pytaniem w tym wątku jest zatrzymanie wykonywania, opublikuję rozwiązanie w oparciu o to, o co prosisz, używając NSOperation.
1- Utwórz NSOperationQueue
NSOperationQueue *_myQueue;
_myQueue = [NSOperationQueue new];
_myQueue.name = @"com.my.queue";
2- Odśwież swoją tabelę z kolejki. (Będę używał bloki ok?)
[_myQueue addOperationWithBlock:^{
//your really expensive function
//and your table reload call
[tableView reloadData];
}];
3- Teraz można anulować wykonanie przy użyciu
//maybe you will want to do this on viewDidDisappear
[_myQueue cancelAllOperations];
Aktualizacja:
Ojej, widziałem, że są opóźnienia przeładowanie stołowego call, ale NSOperation nie ma mechanizmu opóźnienia. Aby rozwiązać ten problem można symulować opóźnienia przy użyciu
[NSThread sleepForTimeInterval:1.5];
przed wywołaniem [tableView reloadData];
w addOperationWithBlock:
lub kontynuować korzystanie GCD jak robisz teraz, i zmieniając odniesienie tableview do weak
uniknąć bloku zachowując swój obiekt Tableview, jak to :
__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];
});
Mam nadzieję, że pomoże ...
Gdzie i kiedy nazywasz tę metodę GCD? – Leo
wewnątrz mojego '- (void) tableView: (UITableView *) tableView willDisplayCell: (UITableViewCell *) komórka forRowAtIndexPath: (NSIndexPath *) indexPath' proszę nie pytać dlaczego, to długa historia –
Tutaj jest cień kodu, ale gdy prosiliście nas, abyśmy nie pytali, nie zrobię tego. Ale, jeśli chcesz anulować coś, co dzieje się w 1,5 sekundy, prawdopodobnie lepiej jest użyć 'NSTimer' (który możesz łatwo anulować, wywołując' unieważnienie' na obiekcie timera) zamiast 'dispatch_after'. – Rob