如何为NSManagedObject做完美的KVO?

an0*_*an0 7 core-data key-value-observing nsmanagedobject ios

这里的完美KVO包括两部分:正确添加观察者并正确删除观察者.

故事:

  1. 我使用一个UITableViewCell(单元格)来显示一个NSManagedObject(对象).
  2. 每个对象都有一些需要通过其单元格观察的动态属性.
  3. 并非所有对象都具有相同的观察属性集.我有选择地添加关键路径观察器,如下所示:

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

  4. 对象可以删除.删除对象时,我必须删除观察者.数据库非常庞大和复杂,所以我绝对不想注册所有单元格来接收moc通知,如NSManagedObjectContextObjectsDidChangeNotification.但是如果必须的话,我可以接受在对象中添加一个单元格ivar,即使它再次成为好的Modle-View-Controller设计模式.

问题:在删除对象时,如何正确删除对象中所有已注册密钥路径的观察者(单元格)?

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

  1. 观察者删除代码的最佳位置在哪里?
  2. 如何确定要注销的关键路径?在删除对象后我无法查询其属性 - 这将导致无法填充的错误,因此我无法编写如下代码:

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

并且我不能盲目地删除未注册的密钥路径的观察者 - 异常(无法删除关键路径"thumbnail_picture"的观察者,因为它未被注册为观察者.)将被抛出.

ado*_*oho 3

一个0,

有一个 NSManagedObject 方法专门用于执行删除定时功能:-prepareForDeletion。

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

您还可以考虑使用:-willTurnIntoFault 和 -didTurnIntoFault。但我认为使用 -prepareForDeletion 会让您更高兴。

安德鲁

PS 此方法记录在类参考中。我谨建议您通过阅读文档来节省时间。