Ios 未调用NSFetchedResultsController controllerDidChangeContext
基本上使用mainThreadManagedObjectContext来获取对象-Ios 未调用NSFetchedResultsController controllerDidChangeContext,ios,core-data,Ios,Core Data,基本上使用mainThreadManagedObjectContext来获取对象- - (NSFetchedResultsController *)fetchedResultsController { if (fetchedResultsController == nil) { NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSManagedObjectContext *
- (NSFetchedResultsController *)fetchedResultsController
{
if (fetchedResultsController == nil)
{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSManagedObjectContext *moc = [roomStorage mainThreadManagedObjectContext];
NSEntityDescription *messageEntity = [roomStorage messageEntity:moc];
[fetchRequest setEntity:messageEntity];
[fetchRequest setFetchBatchSize:20];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(roomJIDString == %@)", roomJID];
[fetchRequest setPredicate:predicate];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:moc
sectionNameKeyPath:nil
cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error])
{
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
return fetchedResultsController;
}
但是,在后台,有一种使用后台managedObjectContext插入对象的方法。然后计划保存更改。保存内部managedObjectContext时调用以下方法:
- (void)managedObjectContextDidSave:(NSNotification *)notification
{
NSManagedObjectContext *sender = (NSManagedObjectContext *)[notification object];
if ((sender != mainThreadManagedObjectContext) &&
(sender.persistentStoreCoordinator == mainThreadManagedObjectContext.persistentStoreCoordinator))
{
XMPPLogVerbose(@"%@: %@ - Merging changes into mainThreadManagedObjectContext", THIS_FILE, THIS_METHOD);
dispatch_async(dispatch_get_main_queue(), ^{
// http://stackoverflow.com/questions/3923826/nsfetchedresultscontroller-with-predicate-ignores-changes-merged-from-different
for (NSManagedObject *object in [[notification userInfo] objectForKey:NSUpdatedObjectsKey]) {
[[mainThreadManagedObjectContext objectWithID:[object objectID]] willAccessValueForKey:nil];
}
[mainThreadManagedObjectContext mergeChangesFromContextDidSaveNotification:notification];
[self mainThreadManagedObjectContextDidMergeChanges];
});
}
}
问题是我的controllerDidChangeContent从未被调用。请记住,内部/后台managedObjectContext没有更新对象;事实上,增加了新的
如果您想查看特定的核心数据代码,我将在XMPPFramework中使用它
编辑:刚刚验证了它在没有谓词的情况下工作。在您的代码示例中,设置“roomJID”的位置不可见。那么,您是否检查了谓词中“roomJIDString”的拼写?大小写等等?