如何为依赖于关系的自定义 Core Data 属性发布通知?

Posted

技术标签:

【中文标题】如何为依赖于关系的自定义 Core Data 属性发布通知?【英文标题】:How to post a notification for a custom Core Data property that is dependent on a relationship? 【发布时间】:2012-10-08 18:10:00 【问题描述】:

我有一个与Invoice 有一对多关系的Client,该属性称为invoices。现在我写了一个自定义的只读属性latestInvoice,我想在我的界面中观察它:

- (MyInvoice *)latestInvoice

  NSArray *invoices = [self valueForKey:@"invoices"];
  NSSortDescriptor *sortDescriptor = [NSSortDescriptor
    sortDescriptorWithKey:@"date" ascending:NO];

  return invoices.count
    ? [invoices sortedArrayUsingDescriptors:@[sortDescriptor]][0]
    : nil;

我将Client注册为invoices的观察者:

- (void)dealloc

  [self removeObserver:self forKeyPath:@"invoices"];


- (void)registerObservers

  [self addObserver:self forKeyPath:@"invoices" options:
    (NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
    context:NULL];


- (void)awakeFromInsert

  [super awakeFromInsert];

  [self registerObservers];


- (void)awakeFromFetch

  [super awakeFromFetch];

  [self registerObservers];

我手动发布更改通知:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
  change:(NSDictionary *)change context:(void *)context

  if ([keyPath isEqualToString:@"invoices"])
  
    [self willChangeValueForKey:@"latestInvoice"];
    [self didChangeValueForKey:@"latestInvoice"];
  

这是观察依赖关系的核心数据属性的正确/无错误/首选方式还是我滥用了框架?

【问题讨论】:

【参考方案1】:

latestInvoice 注册为dependent key 的invoices

+ (NSSet *)keyPathsForValuesAffectingLatestInvoice 
    return [NSSet setWithObjects:@"invoices", nil];

【讨论】:

我应该用头撞墙。感谢您的准确回答。这是相应的文档:developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… 您确认这是否有效?文档中有一个部分指出具有一对多关系的依赖键不起作用。但据我了解,这只是当您尝试观察数组中元素的 of 属性而不是更改数组本身(例如,添加新对象、删除对象)时的问题。 到目前为止,它对我们的 beta 测试人员有效,没有问题。让我们看看发布后会发生什么。

以上是关于如何为依赖于关系的自定义 Core Data 属性发布通知?的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 如何为关系设置值?

如何为一对多关系正确配置 Core Data 数据模型和 NSManagedObject?

如何为不同的产品风格定义不同的依赖关系

如何为我的自定义 UICollectionViewCell 设置属性

Core Data 关系的自定义设置器以强制反向互惠关系

Core Data 属性的自定义 Getter