gpt4 book ai didi

objective-c - 核心数据独立的托管对象上下文共享相同的持久存储看不到变化

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:24:22 27 4
gpt4 key购买 nike

今天我对我的发现感到非常困惑。

我认为只要所有上下文都使用相同的核心数据持久存储,一个上下文中的任何更改都应该在保存上下文后出现在另一个上下文中。

例如在 View Controller A 中,我有 1 个上下文(上下文 A),在 View Controller B 中,我有另一个上下文(上下文 B)。现在上下文 A 和上下文 B 都指向同一个持久存储。

在上下文 A 中,我从持久存储中获取托管对象,更新托管对象的属性,然后使用 managedObjectContext 保存操作将更改保存回持久存储。

现在我打开我的第二个 View Controller 并从同一个持久存储执行获取请求,但是我的第二个 View Controller 没有看到更新的属性更改,直到我重新启动模拟器。

真正奇怪的是,如果这是我第一次将新的托管对象插入到持久存储中, Controller B 会看到更改,但不会显示后续更改。

经过长时间的战斗我已经解决了这个问题,我只是想知道为什么有两个单独的上下文(当然都是在主线程上)共享同一个持久存储在模拟器重新启动之前看不到更改。

对于那些想知道我是如何修复它的人,在我的基本 View Controller 中, Controller A 和 B 都继承自它,而不是分配初始化一个新的上下文(因此 Controller A 和 B 有两个独立的上下文),我告诉基础 View Controller 在应用程序委托(delegate)中引用上下文(结果, Controller A 和 B 现在指向相同的上下文)。

这是解释我所看到的情况的图表:

enter image description here

在第二个 View Controller 中获取的结果值是旧值。

如果我将一些数据提交到持久性存储,只要我从同一个持久性存储中获取,它就应该成为永久性的并且可以在任何地方访问,除非我误解了 managedObjectContext save: 实际上并没有对持久性存储进行更改立即直到应用结果。

最佳答案

没有细节很难找出问题。

一个简单的建议是验证您是否合并了应用中两个不同上下文之间的更改。换句话说,您需要验证主上下文是否合并了来自另一个上下文的更改。这可以像下面这样简单地实现。

注册此通知,例如,在您的 AppDelegate 中或您正在创建核心数据堆栈。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextChanged:) name:NSManagedObjectContextDidSaveNotification object:nil];

实现 contextChanged: 方法来合并更改。

- (void)contextChanged:(NSNotification*)notification
{
if ([notification object] == [self managedObjectContext])
return;

if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(contextChanged:) withObject:notification waitUntilDone:YES];
return;
}

[[self managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];
}

有关更多信息,请参阅 Marcus Zarra tutorial .

此外,如果您将表与 NSFetchedResultsController 结合使用,请记住实现委托(delegate)的方法。有关信息,请参阅 NSFetchedResultsControllerDelegate类。

希望对您有所帮助。

关于objective-c - 核心数据独立的托管对象上下文共享相同的持久存储看不到变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12330075/

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