gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:43:20 25 4
gpt4 key购买 nike

我有一个窗口,其中包含完整的核心数据对象列表,以及一个在选择一个对象时打开的显示窗口。

显示窗口中的某个操作将核心数据对象标记为“读取”。

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

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

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

有什么明显的原因可能导致这种情况吗?我在任何时候都不会创建核心数据对象的副本。显示窗口使用 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 的托管对象上下文绑定(bind)到我的应用程序委托(delegate)的一个属性,该属性返回与其他所有内容使用的相同上下文。我对这个问题非常摸不着头脑。

最佳答案

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

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

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

关于objective-c - NSArrayController 和 Core Data 的行为不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5945139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com