在多个 NSPersistentStoreCoordinator-s 之间传递 NSManagedObjectID-s 是不是安全?

Posted

技术标签:

【中文标题】在多个 NSPersistentStoreCoordinator-s 之间传递 NSManagedObjectID-s 是不是安全?【英文标题】:Is it safe to pass NSManagedObjectID-s between multiple NSPersistentStoreCoordinator-s?在多个 NSPersistentStoreCoordinator-s 之间传递 NSManagedObjectID-s 是否安全? 【发布时间】:2014-02-05 22:30:25 【问题描述】:

我有多个 NSPersistentStoreCoordinator 实例,每个实例只有一个 NSPersistentStore,都指向同一个 sqlite 文件。在我的测试中,在它们之间传递 NSManagedObjectID 对象,然后调用

- (NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID error:(NSError **)error

在 NSManagedObjectContext 上似乎工作正常,但我还没有遇到任何来自苹果的文档,证实这应该可以正常工作。

所以,我的问题是,如果有人知道这是否应该工作(一些苹果文档的链接确认它会很棒!),是否有人知道这通常不应该工作,我应该不这样做,那也太棒了!

【问题讨论】:

从我过去(ios7 之前)所做的测试中,存在使用“SELF IN ...”谓词获取对象在使用来自不同商店的 ID 时没有返回结果的问题(必须首先通过 URI 表示来工作)。除此之外,所有其他操作似乎都可以正常工作。 @DanShelly 听起来很公平,我最初是在传递 URI 表示,但出于好奇/为了锻炼,决定尝试对象 ID,尽管我没有在获取请求中使用这些对象 ID,只是调用 existingObjectWithID :error: 使用它们。 【参考方案1】:

调用该方法总是安全的。它是否返回一个对象是另一回事。

当使用来自不同上下文的对象 ID 时,只有当您调用此方法的上下文已经可以访问该对象时,您才会得到非零结果。这意味着该对象已经存在于持久存储中,这意味着它已经保存在其原始托管对象上下文中。

或者换句话说,如果您已经使用 ID 保存了对象,并且您正在使用对象的永久(保存后)ID,那么您只会得到非零结果。

【讨论】:

谢谢汤姆!我主要采取了所有通常的预防措施,如果我传递一个尚未保存的对象的对象 ID,我会调用 gainPermanentIDsForObjects:error: 并且到目前为止还没有遇到任何问题。你认为在不同的协调器之间传递对象 ID 是否安全,这些协调器有一个存储指向同一个 sqlite 文件?还是我真的应该传递 URI 表示? 传递对象 ID 很好——这就是它们通过公共 API 公开的全部原因。像这样获取永久 ID 可能仍然会在其他协调器中得到 nil 结果,因为它们只能通过转到持久存储文件来查找对象。如果您还没有实际保存该对象,则其他协调员可能还无法访问它。 这是有道理的。为了安全起见,我将在我的代码中添加一些内容以在传递临时 ID 之前检查它们,并在检索它们之后将托管对象为零(我已经在检查 gainPermanentIDsForObjects:error:) 上的错误。谢谢你,好心的先生!

以上是关于在多个 NSPersistentStoreCoordinator-s 之间传递 NSManagedObjectID-s 是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:在存储过程中选择多个字段到多个变量中

如何在多个数组的索引处保存多个元素?

在多个条件上旋转多个列

在多个项目/模块中使用多个属性文件(通过 PropertyPlaceholderConfigurer)

同时在多个元素上添加/删除多个类

XPath 在多个级别具有多个条件?