Синхронизация операции и запуск делегата, когда требуется много времени, чтобы сказать пользователю ждать - PullRequest
0 голосов
/ 12 октября 2011

Я создал NSOperation, чтобы выполнить некоторую тяжелую работу в фоновом режиме, но мне нужно уведомить пользователя, когда это занимает больше времени, чем обычно.Код блокирует текущий поток, поскольку он синхронно читает некоторые большие данные из Интернета, NSTimer не будет запускаться.Есть ли лучший способ сделать это, и если NSTimer - лучший способ его использования?

Любая помощь будет принята с благодарностью, и спасибо заранее.

1 Ответ

0 голосов
/ 12 октября 2011

Вы можете запланировать таймер из основного потока:

- (void)doSomeHeavyWork {
    _TheOperationStillWorking = YES;
    [self performSelectorOnMainThread:@selector(scheduleTimer) withObject:nil waitUntilDone:NO];

    // Some code that BLOCKS the current NSOperation that executes this function...

    _TheOperationStillWorking = NO;
}

- (void)scheduleTimer {
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5000 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:NO];
}

- (void)timerFireMethod {
    OSMemoryBarrier(); // make sure private var is up to date
    if (_TheOperationStillWorking) {
        // updates here will happen on the main thread...
    }
}

Информацию о том, почему вам нужно OSMemoryBarrier() для защиты вашей переменной, см. на этой странице .

...