【问题标题】:Update UITableView when related NSManagedObject is updated更新相关 NSManagedObject 时更新 UITableView
【发布时间】:2023-03-14 04:27:01
【问题描述】:

我在核心数据实体(托管对象)之间有以下关系层次结构:

实体1 > 实体2 > 实体3

Entity1Entity2 之间存在一对一关系,Entity2Entity3 之间存在一对多关系。

我有一个使用NSFetchedResultsController 显示Entity1 记录列表的视图控制器。 UITableViewCell 显示来自Entity1Entity2Entity3 的信息。现在,NSFetchedResultsControllerDelegate 方法会在添加/更新/删除Entity1 对象时自动调用,但是当添加/更新/删除相关的Entity2Entity3 记录时,不会调用委托方法。

在这种情况下,识别相关记录已更新以及UITableViewCell 也需要更新的最佳或可能方法是什么?

【问题讨论】:

    标签: ios core-data nsfetchedresultscontroller nsmanagedobjectcontext


    【解决方案1】:

    你需要弄脏其他实体的属性。换句话说,你应该调用

    [self willChangeValueForKey:@"someProperty"];
    [self didChangeValueForKey:@"someProperty"];
    

    关于您要更新的实体。

    这里有一个示例解决方案,可以实现您想要实现的目标。

    NSFetchedResultsController pitfall

    希望对您有所帮助。

    【讨论】:

    • 这是一个不错的技巧。 - 除了重写相关实体的访问器方法(如链接中所建议的那样),还可以侦听NSManagedObjectContextObjectsDidChangeNotification,如果“Entity2”或“Entity3”对象已更改,请将相关“Entity1”对象标记为肮脏的。 - 另一个想法:向“Entity1”添加一个瞬态“dummy”属性。要将对象标记为脏,您只需为 dummy 属性分配一个值。
    • @MartinR 感谢其他建议。 ;)
    • willChange/DidChange 显然不起作用(不再),也没有将值设置为 nil 然后回到实际值......为我做的诀窍是引入了一个短暂的“脏" 属性并将其设置为时间戳。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    相关资源
    最近更新 更多