Soy un gran admirador de los bloques, pero no los he utilizado para la simultaneidad. Después de buscar en Google, reconstruí esta idea para ocultar todo lo que aprendí en un solo lugar. El objetivo es ejecutar un bloque en el fondo, y cuando esté terminado, ejecutar otro bloque (como la animación UIView) ...Learning NSBlockOperation
- (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);
}
Mis preguntas son:
- Funciona cuando lo ejecuto , pero ¿me falta algo ... tierra oculta mía? No he probado la cancelación (porque no inventé una operación larga), pero ¿parece que funcionará?
- Me preocupa que necesite calificar mi declaración de backgroundOperation para poder referirme a ella en el bloque de finalización. El compilador no se queja, pero ¿hay un ciclo de retención al acecho allí?
- Si la "cadena" fuera un ivar, ¿qué pasaría si la clave-valor la observara mientras el bloque estaba ejecutándose? ¿O configurar un temporizador en el hilo principal y registrarlo periódicamente? ¿Sería capaz de ver el progreso? ¿Lo declararía atómico?
- Si esto funciona como esperaba, parece una buena forma de ocultar todos los detalles y obtener la concurrencia. ¿Por qué Apple no escribió esto para mí? ¿Me estoy perdiendo algo importante?
Gracias.
Ha considerado el uso GCD? ¿O es esto solo un ejercicio de aprendizaje? Una cola en serie suena exactamente como lo que estás buscando. – borrrden