Отмена операции NSOperation и немедленное удаление ее из очереди
Итак, я думал об этом в течение нескольких дней, и мне кажется, что я не могу найти хороший способ заставить это работать.
У меня есть NSOperationQueue, который позволяет выполнять только одну операцию одновременно.
Я понимаю из документации:
В OS X v10.6 и более поздних версиях отмена операции приводит к тому, что операция игнорирует любые зависимости, которые она может иметь. Такое поведение позволяет очереди выполнить метод запуска операции как можно скорее. Метод start, в свою очередь, перемещает операция переходит в завершенное состояние, чтобы ее можно было удалить из очереди.
Что когда я отправлю cancel, он установит isCancelled в YES, но моя проблема заключается в следующем:
Скажем, у меня есть 20 NSOperation в очереди, и я только что отменил 18-й, он останется в NSOperationQueue, пока не сможет работать и не скажет, что он закончен (мой NSOperation проверяет правильно для isCancelled), но поскольку он остается в очереди, он также остается в UITableView, который я установил dataSource на что-то вроде myOperationQueue.operations.
И это то, что меня беспокоит, пользователь нажмет Cancel, который вызовет метод cancel на NSOperation, но операция все равно будет отображаться, поскольку она все еще находится в очереди.
Я думал о вызове start в методе cancel, но это не разрешено, только очередь может start это.
EDIT: я также пытался переопределить isFinished в cancel:
[self willChangeValueForKey:@"isFinished"];
_isFinished = YES;
[self didChangeValueForKey:@"isFinished"];
Это работает, но он также посылает start к следующему NSOperation в очереди, и это может привести к тому, что одновременно будет иметь 2 NSOperation, и я хочу только один.
1 ответ:
Итак, если я правильно понял, список невыполненных операций является источником данных для вашего UITableView.
Одним из решений было бы отфильтровать список операций, чтобы удалить отмененные. Источником данных табличного представления будет этот отфильтрованный список, а не необработанный список операций.