如何做NSManagedObject的完美KVO?
这里完美的KVO包括两部分:正确添加观察者,正确移除观察者。
故事:
- 我使用一个UITableViewCell(单元格)显示一个NSManagedObject(对象)。
- 每个对象都有一些dynamic属性,需要通过其单元观察。
-
并非所有对象都具有相同的观察属性组。 我有select地添加关键path观察者:
if(object.thumbnail_pic_url)[object addObserver:cell forKeyPath:@“thumbnail_picture”options:0 context:NULL];
-
对象可以被删除。 当删除对象时,我必须删除观察者。 该数据库是非常大和复杂的,所以我绝对不希望注册所有单元格接收moc通知,如NSManagedObjectContextObjectsDidChangeNotification。 但是,如果必须的话,我可以接受在对象中添加一个细胞伊娃,即使它再次是好的模式 – 视图 – 控制器devise模式。
问题:如何删除对象的所有注册键path的观察者(单元格)时删除?
事实上,这是一个大问题,可以分为两个小问题:
- 哪里是最好的地方把观察员删除代码?
-
我如何确定注销哪些关键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