Аз съм голям фен на блоковете, но не съм ги използвал за паралелност. След известно търсене в гугъл събрах тази идея, за да скрия всичко, което научих на едно място. Целта е да се изпълни блок във фонов режим и когато приключи, да се изпълни друг блок (като 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 не написа това за мен? Пропускам ли нещо важно?
Благодаря.