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

故事:

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

    如果(object.thumbnail_pic_url)
    [object addObserver:cell forKeyPath:@“thumbnail_picture”选项:0上下文:NULL];
  • 对象可以删除。删除对象时,我必须删除观察者。该数据库非常大且复杂,因此我绝对不希望注册所有单元以接收Moc通知,例如NSManagedObjectContextObjectsDidChangeNotification。但是我必须接受在对象中添加单元格ivar,即使它再次采用了良好的Modle-View-Controller设计模式。

  • 问题:删除对象后,如何从对象中正确删除所有已注册键路径的观察者(单元格)?

    实际上,这是一个大问题,可以分为两个小问题:
  • 将观察者删除代码的最佳位置在哪里?
  • 如何确定要注销的 key 路径?删除对象后,我无法查询其属性-它将导致无法实现的错误,因此无法编写如下代码:

    如果(object.thumbnail_pic_url)
    [对象removeObserver:cell for KeyPath:@“thumbnail_picture”];

  • 而且我也不能盲目地删除未注册键路径的观察者—异常(无法将键路径“thumbnail_picture”的观察者从中移除,因为它没有注册为观察者。)将被抛出。

    最佳答案

    an0,

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

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

    您还可以查看使用:-willTurnIntoFault和-didTurnIntoFault。但是我认为使用-prepareForDeletion将使您更加满意。

    安德鲁

    P.S.该方法记录在类引用中。我谨建议您阅读文档以节省时间。

    关于ios - 如何为NSManagedObject做完美的KVO?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7604256/

    10-13 04:12