NSManagedObjectContextDidSaveNotification 是不是会被调用以进行瞬态属性更新?

Posted

技术标签:

【中文标题】NSManagedObjectContextDidSaveNotification 是不是会被调用以进行瞬态属性更新?【英文标题】:does NSManagedObjectContextDidSaveNotification get called for transient property updates?NSManagedObjectContextDidSaveNotification 是否会被调用以进行瞬态属性更新? 【发布时间】:2011-09-09 09:44:51 【问题描述】:

我似乎无法得到明确的答案:当您更改瞬态属性,然后调用保存时,是否应该触发 NSManagedObjectContextDidSaveNotification?在我的通知侦听器中,如何过滤掉这些来自瞬态属性更改的通知?

这就是我想要做的事情:我想在主线程中加载联系人列表,完成后,我想从地址簿中读取后台线程中的图像并将它们附加到联系人。从表面上看,这很好用:从联系人实体加载后,我使用调度队列循环遍历所有联系人,在通讯簿中找到他们的图像,并将它们保存在联系人的“contactImage”属性中(这是暂时的) .然后调度队列成功地重新加载 tableview(在主线程上)并且图像显示在联系人旁边。 问题是,如果我对在其中一个托管对象上调用“保存”的联系人执行任何操作(例如,我删除了其中一个联系人),则会为所有联系人调用 NSManagedObjectContextDidSaveNotification。我发现这是因为之前更改了 contactImage 属性...评论说“self.contactImage = img;”线使问题消失。这让我很惊讶,因为我认为保存通知只会为非瞬态属性调用。

谁能确认这是否是预期的行为?还是我做错了什么?如果是预期的,你如何过滤掉 NSManagedObjectContextDidSaveNotification 监听器中对瞬态属性的更新?我需要在侦听器中进行一些后处理,并且我不想为瞬态属性更新不必要地进行。我检查了 NSManagedObject 上的 changedValues 字典,但它似乎在侦听器内显示为空(因为只有瞬态属性发生了变化,我猜)。

谢谢。

【问题讨论】:

【参考方案1】:

昨天,

瞬态属性有一个关键特征——它们是受管理的。您可以轻松地将未托管的 ivars 添加到任何 NSManagedObject。如果您这样做,它们不会受到 -save: 通知的影响。

一个相关问题:您为什么使用瞬态 ivar?它们有一些特殊用途;主要用于触发整个模型的属性更新;即您所看到的行为。

第二个相关问题:为什么要在后台获取所有图像,而不是从地址簿中延迟加载它们?在我看来,这似乎是一个过早优化的案例。

安德鲁

【讨论】:

这是有道理的。我正在使用瞬态 ivar,因为我没有想到我可以将 ivars 添加到 NSManagedObject,并且我认为它应该有助于获得一些 Core Data 低内存管理方案。所以只是为了确认:在 DidSaveNotification 侦听器中是否有办法检测更改是否来自瞬态属性?图片的后台获取:查找地址簿条目的代码(尤其是在按名称匹配时)速度并不快,因此如果您不预取图片,您会注意到表格视图滚动时出现断断续续的现象。 跟进:你知道是否可以在 NSManagedObjectContextDidSaveNotification 监听器中检测到更改是否来自瞬态属性? Z S,我没有在 DidSaveNotification 中检查每个属性。也就是说,在任何属性上设置自己的观察者是捕捉属性之前和之后状态的方法。我相信您可以观察到 NSManagedObject 上的任何 @property。安德鲁

以上是关于NSManagedObjectContextDidSaveNotification 是不是会被调用以进行瞬态属性更新?的主要内容,如果未能解决你的问题,请参考以下文章