我在使用NSManagedObjectID时遇到了一些问题,它会根据保存状态的不同而变化。
因此,我决定按照文档和其他人的建议,使用我自己的UniqeID。我在Stack Overflow和其他地方看到过许多示例,在这些地方,只需将NSUUID字符串值存储在核心数据字段中即可。
然而,这还不足以满足我的需求。关于NSManagedObjectID的一个有用的事情是,它总是同一个对象,并且可以通过指针进行比较,所以你可以使用NSManagedObjectID作为对象来发布通知,任何需要实体信息的东西都可以基于NSManagedObjectID注册通知,而不需要编写额外的代码来检查通知是否确实是我们正在寻找的通知。
但是,如果传递的是NSString而不是NSManagedObjectID,这是否仍然是正确的?我们总是应该使用isEqualTo进行NSString比较,即使它可能是同一个对象。我觉得使用NSString作为通知的对象有点不可取。
在我的例子中,它几乎可以保证是同一个对象,除非objective c在幕后摆弄NSString。uniqueID是在插入对象时生成的,并且会在需要时原封不动地传递,我只是想用一些只需最少更改就可以放入的东西来替换所有使用NSManagedObjectID的调用。
CFUUID似乎很理想,因为可以保证它们共享指针值,但是CFUuidRef不是objective-c对象,因此不能用于通知等。除了文档中不能保证它们是同一对象的警告之外,NSUUID似乎是最好的。但是,如果我的NSUUID是在单个对象上创建、存储和检索的,我们能保证传递的NSUUID在整个应用程序中都是相同的对象吗?如果是这样的话,我们不能对NSString说同样的话吗?即使我们可以,我也会更乐意使用NSUUID。
我不能直接传递实体,因为我正在使用通知在不同的线程之间发布信息。尽管我只修改了主线程上的实体,并且实体可以跨线程进行只读访问,但我在过去遇到了许多问题,一旦我实现了一个仅使用NSManagedObjectID的系统,这些问题就都消失了。
发布于 2015-06-30 20:38:09
也许我误解了你,但是为什么不传递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实例?
顺便说一句2:在ARC代码中处理CF对象并不那么困难。
https://stackoverflow.com/questions/31137424
复制相似问题