NSManagedObject作为NSDictionary键?

mru*_*ueg 19 cocoa core-data nsdictionary nscopying

在我的应用程序中,我NSDictionary的键应该是子类的实例NSManagedObject.

然而,问题是NSManagedObject没有实现NSCopying协议,这意味着没有Core Data对象/实例NSManagedObject可以用作字典键,即使该-[hash]方法适用于它们.

我该怎么办?

Mik*_*lah 33

有四种选择:

  1. 改为使用另一个对象作为字典键,并从中进行查找.[object objectID]或者+[NSValue valueWithNonretainedObject:]看起来最明显
  2. 使用CFDictionaryCreateMutable()来创建一个字典,保留键,而不是复制,而是,然后调用CFDictionarySetValue()存储的对象
  3. 在OS X或iOS6 +上,[NSMapTable mapTableWithStrongToStrongObjects]为您提供纯粹的Objective-C等效项CFMutableDictionary
  4. 实现NSCopying你的管理对象的子类,使得它返回self(带如果你不使用ARC的凸起的引用计数)

笔记

+valueWithNonretainedObject:是非常危险的,因为它可能留下一个悬垂的指针; 可能最好避免.

存储对象ID很好,除了对象以临时 ID 开始生命的事实.当上下文保存到磁盘(或被-obtainPermanentIDsForObjects:…调用)时,该ID将更改为永久ID .您的映射代码需要足够智能才能处理此问题,除非它可以保证所有传入对象都具有永久ID.

NSCopying像这样的实现感觉有点icky,但应该工作得很好.碰巧,这正是方法所NSURLSessionTask采取的,我认为字典友好.

在OS X 10.8 Mountain Lion之前,它曾经可以创建一个常规NSMutableDictionary,然后调用CFDictionarySetValue()它.但事实并非如此; 新词典现在具有在CF级别指定的适当复制回调,而不是纯粹的特征NSMutableDictionary.