当managedobjectcontext更改时,NSFetchedResultsController不会更新

时间:2011-11-04 08:14:35

标签: core-data nsfetchedresultscontroller

我创建了一个程序,我有时会将一些锚点移动到另一个

当我移动那些锚时,我会重新计算2个锚点附近的商业距离(锚点之前和之后)。计算在后台完成

我使用此标准代码更新内容

+(void)commit {
    // get the moc for this thread

    [Tools breakIfLock];
    NSManagedObjectContext *moc = [self managedObjectContext];
    NSThread *thread = [NSThread currentThread];

    DLog(@"threadKey commit%@" , [[self class]threadKey]);

    if ([thread isMainThread] == NO) {
        // only observe notifications other than the main thread
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:moc];
    }

    NSError *error;
    if (![moc save:&error]) {
        CLog(@"Error in Saving %@", error);
        DLog(@"What the hell error is it");
    }
    else{

    }

    if ([thread isMainThread] == NO) {
        [[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:moc];
    }
    //[GrabClass StopNetworkActivityIndicatorVisible];

}

+(void)contextDidSave:(NSNotification*)saveNotification {

    dispatch_async(dispatch_get_main_queue(), ^{
        BadgerNewAppDelegate *delegate = [BNUtilitiesQuick appDelegate];
        DLog (@"currentThreadinContextDidSave: %@",[self threadKey]); 
        NSManagedObjectContext *moc = delegate.managedObjectContext; //delegate for main object
        CLog(@"saveNotification : %@",saveNotification);
        [moc mergeChangesFromContextDidSaveNotification:saveNotification];
    });


    //[moc performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) withObject:saveNotification waitUntilDone:YES];
}

我突破并看到距离确实得到了更新。一切都很好

NSFetchedResultsController fetchedObjects似乎没有更新,仍然使用旧值。

怎么可能?

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    DLog(@"controllerWillChangeContent: %@", controller);
    [self.tableViewA beginUpdates];
}
即使NSManagedObjectContext发生了变化,也永远不会调用

实际上,我不确定managedObjectContext是否已经改变。我怎么知道?我的意思是将更改managedObjectContext以确保fetchController.fetchedObjects中的更改。

据我所知,没有缓存。我怎么能确定呢?

1 个答案:

答案 0 :(得分:4)

fetchedObjects属性状态的

The NSFetchedResultsController文档:

  

结果数组仅包含由指定的实体的实例   获取请求(fetchRequest)并匹配其谓词。 (如果   获取请求没有谓词,那么结果数组包含所有   获取请求指定的实体的实例。)

     

结果数组反映了托管对象的内存状态   控制器的托管对象上下文,而不是它们的状态   持久存储。 但是,返回的数组不会更新为   管理对象将被插入,修改或删除。

     

可用性适用于iOS 3.0及更高版本。

我不能说适当的解决方法是什么。我的第一个想法是在委托实现中调用performFetch:中的controllerDidChangeContent:

fetchedObjects数组似乎只是通过使用空实现覆盖controllerDidChangeContent:来更新。这是使用适用于iOS 5.1的iPad和iPad模拟器的情况。

文档和我观察到的内容之间显然存在一些差异。我没有解释。抱歉。我只能建议您在controllerDidChangeContent:中执行抓取只是为了安全起见。