Я большой поклонник блоков, но не использовал их для concurrency. После некоторого поиска я собрал эту идею, чтобы скрыть все, что я узнал в одном месте. Цель состоит в том, чтобы выполнить блок в фоновом режиме, и когда он закончен, выполните другой блок (например, анимацию 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);
}
Мои вопросы:
- Это работает, когда я запускаю его, но я что-то упускаю... скрытая земля моя? Я не тестировал отмену (потому что я не изобрел длинную операцию), но похоже ли, что это сработает?
- Я обеспокоен тем, что мне нужно квалифицировать свое объявление backgroundOperation, чтобы я мог ссылаться на него в блоке завершения. Компилятор не жалуется, но существует ли там цикл удержания?
- Если "строка" была ivar, что произойдет, если бы значение key наблюдало это во время работы блока? Или настроить таймер на основном потоке и периодически регистрировать его? Смогу ли я увидеть прогресс? Могу ли я объявить его атомарным?
- Если это работает так, как я ожидаю, значит, это хороший способ скрыть все детали и получить concurrency. Почему Apple не написала это для меня? Я пропустил что-то важное?
Спасибо.