Изучение NSBlockOperation

Я большой поклонник блоков, но не использовал их для параллелизма. После некоторого поиска в Google я собрал воедино эту идею, чтобы спрятать все, что я узнал, в одном месте. Цель состоит в том, чтобы выполнить блок в фоновом режиме, а когда он будет завершен, выполнить другой блок (например, анимацию UIView)...

- (NSOperation *)executeBlock:(void (^)(void))block completion:(void (^)(BOOL finished))completion {

    NSOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:block];

    NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{
        completion(blockOperation.isFinished);
    }];

    [completionOperation addDependency:blockOperation];
    [[NSOperationQueue mainQueue] addOperation:completionOperation];    

    NSOperationQueue *backgroundOperationQueue = [[NSOperationQueue alloc] init];
    [backgroundOperationQueue addOperation:blockOperation];

    return blockOperation;
}

- (void)testIt {

    NSMutableString *string = [NSMutableString stringWithString:@"tea"];
    NSString *otherString = @"for";

    NSOperation *operation = [self executeBlock:^{
        NSString *yetAnother = @"two";
        [string appendFormat:@" %@ %@", otherString, yetAnother];
    } completion:^(BOOL finished) {
        // this logs "tea for two"
        NSLog(@"%@", string);
    }];

    NSLog(@"keep this operation so we can cancel it: %@", operation);
}

Мои вопросы:

  1. Это работает, когда я запускаю его, но я что-то упускаю. .. скрытый фугас? Я не проверял отмену (потому что не изобрел длинную операцию), но похоже ли, что это сработает?
  2. Я обеспокоен тем, что мне нужно уточнить мое объявление backgroundOperation, чтобы я мог ссылаться на него в блоке завершения. Компилятор не жалуется, но не скрывается ли там цикл сохранения?
  3. Если бы «строка» была ivar, что бы произошло, если бы я увидел ее во время выполнения блока? Или установить таймер в основном потоке и периодически регистрировать его? Смогу ли я увидеть прогресс? Объявлю ли я его атомарным?
  4. Если это работает так, как я ожидаю, то это хороший способ скрыть все детали и добиться параллелизма. Почему Apple не написала это для меня? Я пропустил что-то важное?

Спасибо.

19
задан danh 13 June 2012 в 06:01
поделиться