Ich habe eine NSOperation subclaskiert und meinen completionBlock gesetzt, aber es scheint nie einzutreten, auch wenn der Vorgang beendet ist. Hier ist mein Code:Warum wird mein completionBlock niemals in einer NSOperation aufgerufen?
Ein Katalog Controller-Klasse richtet die NSOperation:
- (void)setupOperation {
...
ImportWordOperation *importWordOperation = [[ImportWordOperation alloc] initWithCatalog:words];
[importWordOperation setMainObjectContext:[app managedObjectContext]];
[importWordOperation setCompletionBlock:^{
[(ViewController *)[[app window] rootViewController] fetchResults];
}];
[[NSOperationQueue mainQueue] addOperation:importWordOperation];
[importWordOperation release];
...
}
Wie Sie sehen, ich bin Einstellung der Fertigstellung Block eine Methode auf dem Haupt-Thread, in einem anderen Controller auszuführen.
Dann, in main
meine Unterklasse NSOperation Klasse: ImportWordOperation.m
, ich fire-up die Hintergrund-Operation. Ich overrode sogar isFinished
iVar, um für die Completion-Methode ausgelöst werden:
- (void)setFinished:(BOOL)_finished {
finished = _finished;
}
- (BOOL)isFinished {
return (self.isCancelled ? YES: finished);
}
- (void)addWords:(NSDictionary *)userInfo {
NSError *error = nil;
AppDelegate *app = [AppDelegate sharedInstance];
NSManagedObjectContext *localMOC = [userInfo valueForKey:@"localMOC"];
NSEntityDescription *ent = [NSEntityDescription entityForName:@"Word" inManagedObjectContext:localMOC];
for (NSDictionary *dictWord in [userInfo objectForKey:@"words"]) {
Word *wordN = [[Word alloc] initWithEntity:ent insertIntoManagedObjectContext:localMOC];
[wordN setValuesForKeysWithDictionary:dictWord];
[wordN release];
}
if (![[userInfo valueForKey:@"localMOC"] save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
[localMOC reset];
[self setFinished:YES];
}
- (void)main {
finished = NO;
NSManagedObjectContext *localMOC = nil;
NSUInteger type = NSConfinementConcurrencyType;
localMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:type];
[localMOC setUndoManager:nil];
[localMOC setParentContext:[self mainObjectContext]];
if (![self isCancelled]) {
if ([self.words count] > 0) {
[self performSelectorInBackground:@selector(addWords:) withObject:@{@"words":self.words, @"localMOC":localMOC}];
}
}
}
Wenn ich isfinished Accessormethoden entfernen, dann wird der Abschluss-Block genannt, aber Art und Weise vor ImportWordOperation
Oberflächen.
Ich habe den Code gelesen, den ich gefunden habe, der einen eigenen Completion-Block verwendet, aber was nützt dann der Completion-Block in NSOperation-Unterklassen?
Irgendwelche Ideen oder Punkte auf eine ähnliche gelöste Situation würden sehr geschätzt werden.
Dank !, es war die 'main' /' Starten' Methode. Ich musste "start" anstelle von "main" implementieren, da ich es gleichzeitig verwenden muss. Ich habe das geändert und KVO in setFinished angepasst und es hat funktioniert !. Ich füge die '-cancel'-Methode hinzu, um die Sache zu runden. –