Warum wird mein completionBlock in einer NSOperation nie aufgerufen?

Ich habe eine NSOperation untergeordnet und meinen CompletionBlock gesetzt, aber es scheint, als würde er niemals eintreten, selbst wenn der Vorgang abgeschlossen ist. Hier ist mein Code:

Eine Katalogcontrollerklasse richtet die NSOperation ein:

- (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, setze ich den Beendigungsblock so, dass eine Methode im Hauptthread in einem anderen Controller ausgeführt wird.

Dann inmain meine untergeordnete NSOperation-Klasse:ImportWordOperation.mIch starte die Hintergrundoperation. Ich habe sogar überranntisFinished iVar, damit die Vervollständigungsmethode ausgelöst wird:

- (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 die isFinished-Zugriffsmethoden entferne, wird der Completion-Block aber schon lange vorher aufgerufenImportWordOperation endet.

Ich habe den gefundenen Code gelesen, der einen eigenen Vervollständigungsblock verwendet, aber wozu dient dann der Vervollständigungsblock in NSOperation-Unterklassen?

Irgendwelche Ideen oder Hinweise auf eine ähnlich gelöste Situation wären sehr dankbar.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage