完美的KVO包括两个部分:正确添加观察者和正确删除观察者。
故事背景:
- 我使用一个UITableViewCell(cell)来显示一个NSManagedObject(object)。
- 每个对象都有一些需要被其cell观察的动态属性。
并非所有对象都具有相同的观察属性。我像这样有选择地添加关键路径观察者:
if (object.thumbnail_pic_url) [object addObserver:cell forKeyPath:@"thumbnail_picture" options:0 context:NULL];
对象可能被删除。当对象被删除时,我必须删除观察者。由于数据库非常大且复杂,因此我绝对不想注册所有单元格以接收moc通知,如NSManagedObjectContextObjectsDidChangeNotification。但是如果必须这样做,我可以接受在对象中添加一个cell ivar,即使这违反了良好的模型-视图-控制器设计模式。
问题:当对象被删除时,我如何正确地为所有已注册的关键路径从对象中删除观察者(cell)?
实际上,这是一个可以分成两个小问题的大问题:
- 哪里是放置观察者移除代码的最佳位置?
如何确定要注销哪些关键路径?在删除对象后,我无法查询其属性——这将导致无法满足的错误,因此我无法编写以下代码:
if (object.thumbnail_pic_url) [object removeObserver:cell forKeyPath:@"thumbnail_picture"];
我也不能盲目地为未注册的关键路径删除观察者——会引发异常(Cannot remove an observer for the key path "thumbnail_picture" from because it is not registered as an observer.)。