我在使用 NSManagedObjectID 时遇到了一些问题,它会根据保存的状态而变化。
因此,我决定按照文档和其他人的建议使用我自己的 UniqeID。我在 Stack Overflow 和其他将 NSUUID 字符串值存储在核心数据字段中很简单的地方看到了很多示例。
但是,这还不够我想要的。NSManagedObjectID 的有用之处之一是它始终是同一个对象并且可以通过指针进行比较,因此您可以使用 NSManagedObjectID 作为其对象发布通知,任何需要有关实体信息的内容都可以根据 NSManagedObjectID 注册通知无需编写额外的代码来检查通知是否确实是我们正在寻找的通知。
但是,如果传递的是 NSString 而不是 NSManagedObjectID,这仍然是真的吗?我们总是应该使用 isEqualTo 进行 NSString 比较,即使它可能是同一个对象。我觉得使用 NSString 作为通知对象有点不妥。
就我而言,它几乎可以保证是同一个对象,除非目标 c 在幕后与 NSString 搞混了。uniqueID 在插入对象时生成一次,并且会根据需要原封不动地传递,我只是想用我可以通过最小更改插入的所有调用替换我使用 NSManagedObjectID 的所有调用。
CFUUID 似乎很理想,因为它们可以保证共享指针值,但是 CFUuidRef 不是 Objective-c 对象,因此不能用于通知等。NSUUID 似乎是最好的,除了文档中的警告说它们不能保证是同一个对象。但是,如果我的 NSUUID 是在单个对象上创建、存储和检索的,我们能否保证传递的 NSUUID 在整个应用程序中都是同一个对象?如果是这样,我们不能对 NSString 说同样的话吗?即使我们可以,我也会更乐意使用 NSUUID。
我不能直接传递实体,因为我正在使用通知在单独的线程之间发布信息。尽管我只修改了主线程上的实体,并且可以跨线程以只读方式访问实体,但我过去遇到过很多问题,一旦我实现了一个仅使用 NSManagedObjectID 的系统,这些问题就都消失了。