Ich bin ein großer Fan von Blöcken, aber habe sie nicht für Parallelität verwendet. Nach einigem googeln habe ich diese Idee zusammengefügt, um alles, was ich gelernt habe, an einem Ort zu verstecken. Das Ziel ist es, einen Block im Hintergrund auszuführen, und wenn es fertig ist, führen Sie einen anderen Block (wie UIView Animation) ...Lernen 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);
}
Meine Fragen sind:
- Es funktioniert, wenn ich es laufen , aber vermisse ich irgendetwas ... verstecktes Land meins? Ich habe die Stornierung nicht getestet (weil ich keine lange Operation erfunden habe), aber sieht es so aus, als würde es funktionieren?
- Ich bin besorgt, dass ich meine Deklaration von backgroundOperation qualifizieren muss, damit ich im Completion-Block darauf verweisen kann. Der Compiler beklagt sich nicht, aber lauert dort ein Retain-Zyklus?
- Wenn die "string" ein ivar wäre, was würde passieren, wenn ich Schlüssel-Wert beobachtete, während der Block lief? Oder einen Timer für den Haupt-Thread einrichten und ihn regelmäßig protokollieren? Würde ich Fortschritte sehen können? Würde ich es atomar erklären?
- Wenn dies so funktioniert, wie ich es erwarte, dann scheint es eine gute Möglichkeit zu sein, alle Details zu verbergen und Nebenläufigkeit zu erhalten. Warum hat Apple das nicht für mich geschrieben? Fehle ich etwas Wichtiges?
Danke.
Haben Sie darüber nachgedacht GCD mit? Oder ist das eine reine Lernübung? Eine serielle Warteschlange klingt genau nach dem, wonach Sie suchen. – borrrden