Отмена операции 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.
Одним из решений было бы отфильтровать список операций, чтобы удалить отмененные. Источником данных табличного представления будет этот отфильтрованный список, а не необработанный список операций.