Sono un grande fan dei blocchi, ma non li ho usati per la concorrenza. Dopo aver cercato su Google, ho messo insieme questa idea per nascondere tutto ciò che ho imparato in un unico posto. L'obiettivo è quello di eseguire un blocco in background, e quando è finito, eseguire un altro blocco (come UIView animazione) ...Apprendimento 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);
}
Le mie domande sono:
- Funziona quando lo eseguo , ma mi manca qualcosa ... la mia terra nascosta? Non ho provato la cancellazione (perché non ho inventato una lunga operazione), ma sembra che funzionerà?
- Sono preoccupato del fatto che è necessario qualificare la mia dichiarazione di backgroundOperation in modo che possa fare riferimento ad esso nel blocco di completamento. Il compilatore non si lamenta, ma c'è un ciclo di conservazione in agguato lì?
- Se la "stringa" era un ivar, cosa accadrebbe se il valore-chiave I lo osservasse mentre il blocco era in esecuzione? O imposta un timer sul thread principale e lo registra periodicamente? Sarei in grado di vedere i progressi? Lo dichiarerei atomico?
- Se questo funziona come mi aspetto, allora sembra un buon modo per nascondere tutti i dettagli e ottenere concorrenza. Perché Apple non ha scritto questo per me? Mi sto perdendo qualcosa di importante?
Grazie.
Avete pensato di utilizzare GCD? O è solo un esercizio di apprendimento? Una coda seriale suona esattamente come quello che stai cercando. – borrrden