如何做NSManagedObject的完美KVO?

这里完美的KVO包括两部分:正确添加观察者,正确移除观察者。

故事:

  1. 我使用一个UITableViewCell(单元格)显示一个NSManagedObject(对象)。
  2. 每个对象都有一些dynamic属性,需要通过其单元观察。
  3. 并非所有对象都具有相同的观察属性组。 我有select地添加关键path观察者:

    if(object.thumbnail_pic_url)[object addObserver:cell forKeyPath:@“thumbnail_picture”options:0 context:NULL];

  4. 对象可以被删除。 当删除对象时,我必须删除观察者。 该数据库是非常大和复杂的,所以我绝对不希望注册所有单元格接收moc通知,如NSManagedObjectContextObjectsDidChangeNotification。 但是,如果必须的话,我可以接受在对象中添加一个细胞伊娃,即使它再次是好的模式 – 视图 – 控制器devise模式。

问题:如何删除对象的所有注册键path的观察者(单元格)时删除?

事实上,这是一个大问题,可以分为两个小问题:

  1. 哪里是最好的地方把观察员删除代码?
  2. 我如何确定注销哪些关键path? 删除对象后,我无法查询它的属性 – 这将导致无法填充的错误,所以我不能这样写代码:

    if(object.thumbnail_pic_url)[object removeObserver:cell forKeyPath:@“thumbnail_picture”];

而且我也不能盲目移除未注册关键path的观察者 – exception(不能移除关键path“thumbnail_picture”的观察者,因为它没有注册为观察者)将被抛出。

AN0,

有一个NSManagedObject方法只是为了执行删除定时函数:-prepareForDeletion。

其文档声称:“您可以实现此方法来执行删除对象之前所需的任何操作,例如关系closures之前的自定义传播或使用键值观察重新configuration对象。

你也可以看看使用:-willTurnIntoFault和-didTurnIntoFault。 但我想你会更快乐地使用-prepareForDeletion。

安德鲁

PS此方法logging在课程参考中。 我恭敬地build议您通过阅读文档来节省时间。

在这里实现KVO的主要问题是,你不知道什么时候该对象被删除,至less不在NSManagedObject子类之外,你真正可以做的是在NSManagedObject的子类上创build一个通用委托并覆盖它的didChangeValueForKey:方法

// DataObservingManagedObject.h #import <Foundation/Foundation.h> #import <MMRecord/MMRecord.h> @protocol DataObservingDelegate <NSObject> -(void)valueChangedForKey:(NSString*)key andValue:(id)value; @end @interface DataObservingManagedObject : NSManagedObject @property(nonatomic,weak)id<UserStatusDelegate> changeDelegate; @end //DateObservingManagedObject.m #import "DateObservingManagedObject.h" @implementation DateObservingManagedObject @synthesize changeDelegate=_changeDelegate; -(void)didChangeValueForKey:(NSString *)key{ [self.changeDelegate valueChangedForKey:key andValue:[self valueForKey:key]]; } @end