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