更改 NSManagedObject 上的属性,它会发送通知吗?

Posted

技术标签:

【中文标题】更改 NSManagedObject 上的属性,它会发送通知吗?【英文标题】:Change a property on NSManagedObject, does it send a notification? 【发布时间】:2014-06-18 20:14:42 【问题描述】:

我可以在一个位置更改 NSManagedObject 的属性并在其他地方获得通知吗?

我需要从服务器下载一堆照片和每张照片的信息。在我的数据模型中,我检索所有照片的信息,然后将NSManagedObject 传递给自定义UIView 以显示照片和照片的图像。我还没有设置UIImageView 的图像,因为我没有它。

然后我的模型开始从服务器异步检索每张照片。当照片完成下载后,我想为照片设置NSManagedObject 属性(只是一个 NSData 属性)。当我这样做时,我希望自定义 UIView 收到对象已更改的通知,并将 UIImaveView 的图像设置为刚刚下载的图像。

我的自定义 UIView 是否可以判断 NSManagedObject 何时更改?

我只问因为我注意到当我向NSManagedObject 添加一个类别时,当我想设置一个属性时,建议这样做:

-(void)setHasNewData:(NSNumber *)hasNewData 
    [self willAccessValueForKey:@"hasNewData"];
    [self setPrimitiveValue:hasNewData forKey:@"hasNewData"];
    [self didAccessValueForKey:@"hasNewData"];

    self.modifiedDateLocal = [NSDate date];

【问题讨论】:

NSNotificationCenter postNotification 有什么问题? 【参考方案1】:

首先,我不建议使用这样的 set 访问器。您最好使用动态属性,然后覆盖生命周期方法-willSave 并在那里设置修改日期。这样,您将获得保存到磁盘的修改日期,并且每次保存时对修改日期的更新发生一次。您可以执行以下操作:

- (void)willSave

  [super willSave];
  if ([self changedValues][@"modifiedDateLocal"] == nil) return;
  [self setModifiedDateLocal:[NSDate date]];

当保存发生时,Core Data 将在保存发生之前对每个实体调用-willSave。如果一个实体改变了一些东西,那么这个过程就会重新开始。因此,我们检查以确保我们尚未修改 modifiedDateLocal 以避免无限循环。

对于您的 UIView,您可以使用 KVO(键值观察)来监视 NSManagedObject 的特定实例上的属性,或者您可以侦听 NSManagedObjectContextObjectsDidChangeNotification,它会在任何时候触发任何实体上的任何属性变化。但请注意,它非常健谈,因此价格昂贵。

【讨论】:

我能想到的唯一其他选择是让自定义视图让服务器调用下载并在完成时显示并保存更改。这似乎破坏了 MVC,但似乎最直接。 那会很糟糕。您不想将视图控制器连接到网络调用。视图控制器应该监听核心数据。

以上是关于更改 NSManagedObject 上的属性,它会发送通知吗?的主要内容,如果未能解决你的问题,请参考以下文章

在另一个版本中更改 NSManagedObject 父实体

为将来的 NSManagedObject 插入更改某些属性的默认值?

NSManagedObject 时间戳更新

观察 NSManagedObject 属性的变化:如何避免循环?

保存时检测对 NSManagedObject 的更改

为关系内部的属性设置值时“无法调用 NSManagedObject 类上的指定初始化程序”(核心数据)