Por que meu completionBlock nunca é chamado em um NSOperation?

Eu subloquei uma NSOperation e defini meu completionBlock, mas parece que nunca entra mesmo quando a operação termina. Aqui está meu código:

Uma classe de controlador de catálogo configura o 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];
...
}

Como você pode ver, estou definindo o bloco de conclusão para executar um método no thread principal, em algum outro controlador.

Então, emmain minha classe NSOperation subclassificada:ImportWordOperation.m, Eu atiro a operação de fundo. Eu até canceleiisFinished iVar para que o método de conclusão seja acionado:

- (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}];
        }
    }
}

Se eu remover os métodos de acesso isFinished, o bloco de conclusão será chamado, mas muito antesImportWordOperation acabamentos.

Eu li código que eu encontrei que usa seu próprio bloco de conclusão, mas então qual é o uso para o bloco de conclusão em subclasses NSOperation assim mesmo?

Qualquer idéia ou ponto para uma situação similar seria muito apreciada.

questionAnswers(2)

yourAnswerToTheQuestion