gpt4 book ai didi

ios - 核心数据 : Parent context and change propagation

转载 作者:可可西里 更新时间:2023-11-01 03:30:41 26 4
gpt4 key购买 nike

我的应用程序中有以下核心数据设置:

Persistent Store Coordinator
^ Background MOC (NSPrivateQueueConcurrencyType)
^ Main Queue MOC (NSMainQueueConcurrencyType)

初始化代码如下:

_backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_backgroundContext setPersistentStoreCoordinator:self.coordinator];
_mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_mainContext setParentContext:_backgroundContext];

我使用后台MOC导入大量数据。我还使用它在后台执行复杂的提取请求,然后将对象 ID 传递到主队列以使用这些 ID 提取对象。

这很好用。但是,我不确定如何让主队列 MOC 知道后台 MOC 所做的更改。我知道如果我在主队列 MOC 上执行获取请求,它将获得更改,但这不是我想要的。

是否可以使用后台MOC发布的NSManagedObjectContextObjectsDidChangeNotification通知,在主队列MOC上调用mergeChangesFromContextDidSaveNotification:?这应该会导致主队列 MOC 的 NSManagedObjectContextObjectsDidChangeNotification 通知触发。我正在我的 View Controller 中监听此通知,并检查 userInfo 的更改并相应地重新显示数据。我认为如果你有一个持久存储协调器和两个附加的 MOC,你通常会这样做。但是当您有子/父上下文时,我不确定这是否是正确的方法。

最佳答案

让主 MOC 使用私有(private)父 MOC 进行异步 I/O 很好。但是,除了代表主 MOC 执行后台工作之外,您不应将该父 MOC 用于任何其他用途。造成这种情况的原因有很多(其中包括与 transient 对象 ID 相关的性能和令人讨厌的问题)。

如果您想对商店进行后台更新,这是我的建议。

PSC <--+-- PrivateMOC <---- MainMOC
|
+-- BackgroundPrivateMOC

这将允许对主 MOC 造成最少中断的后台操作,同时允许共享 PSC 缓存。

现在,为了共享数据...

MainMOC 应该监听并合并来自 BackgroundPrivateMO 的 DidSave 通知。

BackgroundMOC 可以监听和合并来自 PrivateMOC 的 DidSave 通知。

这允许合并仅使用永久对象 ID 并优化性能。

关于ios - 核心数据 : Parent context and change propagation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19452487/

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