gpt4 book ai didi

iphone - 执行 block 并等待 : to save a root managed object context synchronously doesn't provide non temporary Object IDs

转载 作者:搜寻专家 更新时间:2023-10-30 20:22:08 24 4
gpt4 key购买 nike

根据 iOS5 发行说明和 WWDC2011 演示示例,我将根托管对象上下文设置为 NSPrivateQueueConcurrencyType 类型。我有一个类型为 NSMainQueueConcurrencyType 的子上下文(称为默认上下文)。

当我保存子上下文,然后使用 block API 保 stub 上下文时:performBlockAndWait:,我希望操作是同步的。

也就是说,在这个 block 执行之后,我应该能够为所有刚插入数据存储的对象获取非临时的 ObjectID

但是,我得到的是临时对象 ID!就好像 performBlockAndWait: 退化为 performBlock: 并异步运行。但是为什么?

这是一个错误,还是我遗漏了一些关键假设?

这里是一些相关的代码:

// Setup of the root MOC:
__rootContext = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[__rootContext setPersistentStoreCoordinator:[self coordinator]];

// Setup of the child MOC; I use it as the "default" context:
__defaultContext = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSMainQueueConcurrencyType];
[__defaultContext setParentContext:__rootContext];

// Here's the essence of the save operation:
[__defaultContext save:&error]

// Setup a block I can invoke that does the save:
void (^rootContextSaveOperation)(void) = ^{
NSError *rootContextError = nil;
BOOL wasRootContextSaveSuccessful = [rootContext save:&rootContextError];
if (!wasRootContextSaveSuccessful) {
NSLog(@"RPDataStore: Error saving root context."); }
};

// Call perform block and wait with the operation:
[__rootContext performBlockAndWait:rootContextSaveOperation];

// Now when I inspect one of the objects just saved, I have this check in my unit test:
BOOL isTempID = [[user objectID] isTemporaryID];

问题是,对于刚刚从其叶 MOC 保存到根的 MOC 层次结构的“用户”对象部分,不幸的是,“isTempID”标志显示"is"。

我的期望是我可以同步执行保存以获得可在其他上下文中使用的永久对象 ID。

我对 performBlockAndWait: 的概念性期望是否不正确?

如果是这样,我如何与此 MOC 队列配置同步保存并仍然立即获得非临时 ObjectID?

最佳答案

对于可能有用的人,我的解决方法是为唯一检索它的托管对象构建一个提取预测。

我针对根托管对象上下文执行此提取,然后,我可靠地获得了我之前保存的托管对象的非临时对象 ID。在我的例子中,我已经有托管对象来报告可以在搜索中使用哪些键集,这将唯一地标识它们。

另一种选择是在初始保存子上下文之前为上下文中的所有对象获取永久对象 ID。然后,您可以使用 NSManagedObjectContext 的 refreshObject:mergeChanges: 来刷新范围内特定对象的当前引用。现在它将反射(reflect)刚刚保存在子上下文中的更改。

使用 NSManagedObjectContext 的方法获取永久对象 ID obtainPermanentIDsForObjects:error:

关于iphone - 执行 block 并等待 : to save a root managed object context synchronously doesn't provide non temporary Object IDs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7924415/

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