NSArrayController 和 Core Data 的行为不符合预期

Posted

技术标签:

【中文标题】NSArrayController 和 Core Data 的行为不符合预期【英文标题】:NSArrayController and Core Data not behaving as expected 【发布时间】:2011-05-10 04:22:27 【问题描述】:

I have a window with a list full of Core Data objects, and a display window that opens when one is selected.

显示窗口中的某个动作将 Core Data 对象标记为“读取”。

要打开一个对象,我将对象传递给显示窗口,以及显示列表的 sortDescriptors 和 filterPredicate,因此显示窗口可以向前/向后导航(主窗口有时会显示对象的子集,即为什么我需要 sortDescriptors 和 filterPredicate)。

将打开的对象标记为已读效果很好。由于 KVO,它会在主窗口中自动更新。

但是,当我在显示窗口中向前/向后导航到不同的对象时,标记为已读不再起作用。我浏览代码并查看代码执行,检查新值,并将其标记为已读 - 但这不会反映在主窗口或数据库中。

有什么明显的原因可能导致这种情况吗?在任何时候,我都不会创建核心数据对象的副本。显示窗口使用 NSArrayController 来获取数据,并对其应用 sortDescriptors 和 filterPredicate。我获取下一个对象的代码如下所示:

-(MyObject *object)nextObject 

    // _object is the object being displayed by the display window.
    // _listContainingObject is an NSArrayController set to Entity: Object

    NSArray *list = [_listContainingObject arrangedObjects];

    NSUInteger positionInList = 0;
    for (MyObject *object in list) 

        if ([[[object objectID] URIRepresentation] isEqualTo: [[_object objectID] URIRepresentation]])             break;
        
        positionInList++;
    

    if (positionInList == [list count] - 1) return nil;

    if (positionInList + 1 > [list count] - 1) return nil;

    MyObject *object = [list objectAtIndex: positionInList + 1];

    return object;    


看起来我真的遇到了一些核心数据的隐藏问题,就像从不同的 NSArrayController 中提取的对象是副本......但一切都在同一个 ManagedObjectContext 上运行。 NSArrayController 的托管对象上下文绑定到我的应用程序委托的一个属性,该属性返回与其他所有内容相同的上下文。我在这个问题上非常努力。

【问题讨论】:

【参考方案1】:

请记住,当您处理项目时,您的 managedObjectContext 充当便笺簿。在您实际保存托管对象上下文之前,您对托管对象所做的更改不会反映在数据库中。

因此,在您将项目标记为已读或未读后,您需要保存上下文。

NSError *saveContextError=nil;
if (![yourManagedObjectContext save:&saveContextError)
    // Handle the error
    NSLog(@"managedObjectContext save error:  %@",error);

【讨论】:

很遗憾,这不是 - 我会随时进行更改。 我接受这个是正确的,因为它足够接近 - 结果我正在处理不同的托管对象上下文,出于某种原因,尽管应用程序委托返回相同的对象。仍然非常不稳定,但它现在似乎正在工作。

以上是关于NSArrayController 和 Core Data 的行为不符合预期的主要内容,如果未能解决你的问题,请参考以下文章

如何将 NSArray 和 NSArrayController 与 Core Data 一起使用?

绑定到 NSArrayController 的 core-plot 条形图

如何使用 Core Data 设置 NSArrayController?

如何通过 NSArrayController 从 Core Data 填充 NSTableView?

Core Data Mac OS X 基于文档的应用程序中的 NSArrayController 类与实体模式

两个 NSArrayController 和一个关系(CoreData)