Отмена операции 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 2

1 ответ:

Итак, если я правильно понял, список невыполненных операций является источником данных для вашего UITableView.

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