Как остановить текущую NSOperation? - PullRequest
6 голосов
/ 19 октября 2011

Я использую NSOperationQueue и NSOperation для запуска какой-либо функции при щелчке фона. Но я хочу иметь возможность, когда пользователь нажимает какую-то кнопку, остановить эту операцию.

Как я могу это сделать?

Что-то вроде, [currentoperation stop];
Cancel - не сработает. Я хочу немедленно остановиться.

Спасибо

Ответы [ 3 ]

15 голосов
/ 19 октября 2011

Вы должны вызывать метод -cancel, и сама операция должна поддерживать отмену путем мониторинга свойства / пути к ключу isCancelled и безопасной остановки, когда его значение становится YES. Если NSOperation принадлежит вам, вам, вероятно, придется создать собственный подкласс для реализации этой функциональности. Вы не можете (безопасно) принудительно остановить произвольную операцию. Он должен поддерживать отмену.

8 голосов
/ 19 октября 2011

Вы не можете немедленно остановиться, используя все, что Apple предоставляет с NSOperation. Вы можете использовать -[cancel], как предложили другие люди, но текущая операция будет продолжаться до завершения. Один из способов приблизиться к использованию -[isCancelled] внутри вашей операции и разбросать его по всему коду (особенно в длинных циклах). Что-то вроде:

- (void)main {
    // do a little work
    if ([self isCancelled]) { return; }

    // do a little more work
    if ([self isCancelled]) { return; }
}

Таким образом, вы сравнительно скоро остановитесь.

Если вы действительно хотите остановить поток, возможно, вам придется изучить обработку сигналов. Здесь есть пример с резьбой . Отправляя пользовательский сигнал определенному потоку, вы можете затем каким-то образом завершить этот поток. Это будет намного больше работы, и, вероятно, будет гораздо больше проблем, чем оно того стоит.

1 голос
/ 19 октября 2011

вы используете cancel и проверьте, был ли self (NSOperation) отменен во время выполнения.

...