Я использую подкласс NSOperation
(называемый PointsOperation) для выполнения некоторых вычислений в фоновом режиме в моем приложении.Из-за поведения пользователя эти вычисления могут быть отменены, и начались новые вычисления.В этом случае я создам новый экземпляр PointsOperation
и добавлю его к тому же NSOperationQueue
, что и первый.Первым делом в основном методе PointsOperation он проверит, запущена ли другая операция, и отменит ее.
Поскольку операции используют некоторые общие кэши, они не могут (и не нужны).быть) работает параллельно.Поэтому вторая операция будет ждать, пока первая не завершится.Результирующий код для метода main выглядит примерно так:
static NSOperation *currentOperation = nil;
- (void) main
{
// setting up autorelease pool, catching exceptions, etc
@synchronized(lock) {
if (currentOperation != nil) {
[currentOperation cancel];
[currentOperation waitUntilFinished];
}
currentOperation = self;
}
while (!calculationsFinished && ![self isCancelled]) {
// do calculations
}
currentOperation = nil;
// releasing autorelease pool, etc
}
Все это отлично работает, первая операция отменяется, а вторая ожидает ее завершения, а затем начинает вычисление.
Проблема в том, что между первой операцией, завершающей основной метод, и второй, выходящей из waitUntilFinished
.
* 1013, уходит 3-10 секунд.что с этим делать?
Я также попытался вместо waitUntilFinished
сделать вторую операцию зависимой от первой с помощью addDependency: (в методе init, а не в main).Это также работает, но имеет ту же проблему: начало второй операции составляет несколько секунд после окончания первого метода.