Написание NSOperation-дружественных методов - PullRequest
2 голосов
/ 13 декабря 2010

У меня есть объект (Processor), содержащий несколько методов, которые выполняют длительные вычисления. Я хотел бы использовать эти методы как в основном потоке, так и в подклассах NSOperation.

Внутри моего NSOperation кода подкласса я неоднократно называю isCancelled, поэтому отмена довольно отзывчива. Однако, когда операция вызывает один из этих длинных Processor методов, она не может ответить на отмену, пока этот метод не вернется.

Есть ли хороший способ написания методов, чтобы их можно было использовать как с операциями, так и без них? Я подумываю добавить аргумент operation к моим ресурсоемким Processor методам и написать их так:

- (void)calculateWithOperation:(NSOperation *)operation {
    do {
        if (operation != nil && [operation isCancelled]) {
            return;
        }
        // Do some more calculation...
    } while (! finished);
}

// For convenient main thread execution.
- (void)calculate {
    [self calculateWithOperation:nil];
}

Кто-нибудь еще сталкивался с этой проблемой раньше? Есть ли лучший способ?

1 Ответ

2 голосов
/ 13 декабря 2010

Единственный способ для NSOperation ответить на отмену состоит в том, чтобы проверить, отменено ли это так часто, как это возможно. В конце концов, это просто поток, который должен выйти, когда установлен флаг. По сути, инфраструктура isCancelled необходима для изящного освобождения ресурсов операции. Так что я бы сказал, что вам просто нужно поперчить дорогой метод чеками.

...