我有一个NSFetchedResultsController
和几个操作通过NSOperationQueue
.
FRC(及其谓词)如下所示:
- (NSFetchedResultsController*)fetchedResultsController
{
if(fetchedResultsController) return fetchedResultsController;
NSManagedObjectContext* mainContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Check" inManagedObjectContext:mainContext]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"isSync == %@", [NSNumber numberWithBool:NO]]];
[fetchRequest setFetchBatchSize:10];
fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:mainContext sectionNameKeyPath:nil cacheName:nil];
fetchedResultsController.delegate = self;
[fetchRequest release], fetchRequest = nil;
return fetchedResultsController;
}
主线程和线程操作都有自己的托管对象上下文。他们只共享同一个协调器。
在线程操作中,我将isSync
属性从更改NO
为YES
。要知道Check
要更新的实体是什么,主上下文传递给线程一个 a NSManagedObjectID
。线程操作检索托管对象,如下所示:
-(void)main
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSManagedObjectContext *exportContext = [[NSManagedObjectContext alloc] init];
[exportContext setPersistentStoreCoordinator:[self persistentStoreCoordinator]];
//...
Check* check = (Check*)[exportContext existingObjectWithID:objID error:&error];
check.isSync = [NSNumber numberWithBool:YES];
//...
[exportContext save:&error];
[pool release], pool = nil;
}
当线程操作调用通知时save
,mergeChangesFromContextDidSaveNotification
主上下文会合并更改。
- (void)contextChanged:(NSNotification*)notification
{
if ([notification object] == [self managedObjectContext]) return;
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(contextChanged:) withObject:notification waitUntilDone:YES];
return;
}
[[self managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];
}
记录notification
潜在客户的描述以验证更改是否正确执行。
我的问题
NSFetchedResultsControllerDelegate
不调用委托方法。
这很奇怪,因为处理相同的上下文(主要上下文)允许监听更改并调用委托方法,例如删除UITableView
.
我发现一些关于 SO 的主题有同样的问题。我已经尝试了所有解决方法,但找不到有价值的解决方案:
先感谢您。
编辑
上面的代码在以前的模型中工作。然后我创建了一个从前一个模型复制(和粘贴)实体的新模型,现在它不再工作了。
建议?
编辑 2
这是我在NSFetchedResultsController
getter 中使用的谓词。这是我的错,但是当我写这篇文章时,我没有复制它。
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"insertionDate" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
// previous code here
[fetchRequest setSortDescriptors:sortDescriptors];
现在,关于乔迪的最后评论
在您的 NSOperation 的 main() 中,您正在加载新对象,并且看起来您正在将每个新对象的 isSync 设置为 YES。您用于 fetchedResultsController 的谓词仅查找具有 isSync == NO 的对象。
我期望当属性isSync
设置为 YES 时,NSFetchedResultsController
观察者会更改并删除与谓词不匹配的行。我错了吗?
请记住,当将更改从后台合并到主线程时,我可以看到很少有对象更新了它们的isSync
属性。