NSUUID作为唯一ID替换为NSManagedObjectID

时间:2015-06-30 11:47:29

标签: objective-c multithreading core-data nsstring nsuuid

我使用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一起去。

我无法直接传递Entity,因为我正在使用通知在不同的线程之间发布信息。即使我只修改主线程上的实体,并且可以跨线程访问实体以进行只读,但过去我遇到了很多问题,一旦我基于仅使用NSManagedObjectID实现了系统,一切都消失了。 / p>

1 个答案:

答案 0 :(得分:0)

也许我弄错了,但为什么不绕过NSUUID的实例(如果你不想使用NSString的实例)并在相等上比较它们呢?

@interface NSUUID(Equality)
- (BOOL)isEqualToUUID:(NSUUID*)other;
@end

@implementation NSUUID(Equality)
- (BOOL)isEqualToUUID:(NSUUID*)other
{
   return [self.UUIDString isEqualToString:other.UUIDString];
}

// Only for completness
- (BOOL)isEqual:(id)other
{
  if( [other isKindOfClass:[NSUUID class]] )
  {
    return [self isEqualToUUID:other];
  }
  return NO;
}
@end

顺便说一句:与使用NSString实例作为通知对象感觉不好的相同原因不适用于NSUUID的实例?

BTW 2:在ARC代码中处理CF对象并不困难。