我已經sublcassed一個NSOperation並設置我的completionBlock,但它似乎永遠不會進入,即使當操作完成。這裏是我的代碼:爲什麼我的completionBlock永遠不會在NSOperation中調用?
目錄控制器類樹立的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];
...
}
正如你所看到的,我設置完成塊主線程上執行的方法,在一些其他的控制器。
然後,在main
我的子類NSOperation類:ImportWordOperation.m
,我啓動後臺操作。我甚至爲了推翻isFinished
伊娃纔會觸發完成方法:
- (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}];
}
}
}
如果我刪除isFinished存取方法,然後完成塊被調用但在此之前的方式ImportWordOperation
結束。
我讀過的代碼使用了它自己的完成塊,但是NSOperation子類中的完成塊有什麼用處?
任何想法或指向類似的解決情況將不勝感激。
感謝!這是'main' /'start'方法。我需要實現'start'而不是'main',因爲我需要它是併發的。我改變了這一點,並調整了setFinished KVO,它的工作!我正在添加'-cancel'方法來整理事情。 – 2013-03-26 17:08:05