Ios 未调用NSFetchedResultsController controllerDidChangeContext

Ios 未调用NSFetchedResultsController controllerDidChangeContext,ios,core-data,Ios,Core Data,基本上使用mainThreadManagedObjectContext来获取对象- - (NSFetchedResultsController *)fetchedResultsController { if (fetchedResultsController == nil) { NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSManagedObjectContext *

基本上使用mainThreadManagedObjectContext来获取对象-

- (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”的拼写?大小写等等?