Purtroppo, non si può fermare l'esecuzione GCD, ma c'è un altro modo di correggi questo bug Poiché la domanda principale in questo thread riguarda l'interruzione dell'esecuzione, pubblicherò una soluzione basata su ciò che chiedi, usando NSOperation.
1- Creare un NSOperationQueue
NSOperationQueue *_myQueue;
_myQueue = [NSOperationQueue new];
_myQueue.name = @"com.my.queue";
2- Ricarica il tuo tavolo dalla coda. (Userò blocchi ok?)
[_myQueue addOperationWithBlock:^{
//your really expensive function
//and your table reload call
[tableView reloadData];
}];
3- Ora è possibile annullare l'esecuzione utilizzando
//maybe you will want to do this on viewDidDisappear
[_myQueue cancelAllOperations];
Aggiornamento:
Ops, ho visto che si stanno ritardando la ricarica da tavolo chiamata, ma NSOperation non ha un meccanismo di ritardo. Per risolvere questo è possibile simulare un ritardo utilizzando
[NSThread sleepForTimeInterval:1.5];
prima di chiamare [tableView reloadData];
all'interno addOperationWithBlock:
o continuare a utilizzare GCD come si sta facendo in questo momento, e cambiando il riferimento del tableView per weak
per evitare il blocco conservando l'oggetto tableView, come questo :
__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];
});
Spero che aiuti ...
Dove e quando si chiama questo metodo GCD? – Leo
all'interno del mio '- (void) tableView: (UITableView *) tableView willDisplayCell: (UITableViewCell *) cella forRowAtIndexPath: (NSIndexPath *) indexPath' non chiedere perché, è una lunga storia –
C'è un pizzico di codice odore qui, ma come tu ci hai chiesto di non indagare, non lo farò. Ma, in fondo, se vuoi cancellare qualcosa che accade in 1,5 secondi, è probabilmente meglio usare 'NSTimer' (che puoi cancellare facilmente chiamando' invalidate' sull'oggetto timer) piuttosto che 'dispatch_after'. – Rob