1

私はClientと多くの関係を持っているを持っていInvoiceます、プロパティはと呼ばれ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"];
  }
}

これは、関係に依存するCore Dataプロパティを監視するための正しい/バグのない/好ましい方法ですか、それともフレームワークを悪用しますか?

4

1 に答える 1

1

従属キーlatestInvoiceとして登録します。invoices

+ (NSSet *)keyPathsForValuesAffectingLatestInvoice {
    return [NSSet setWithObjects:@"invoices", nil];
}
于 2012-10-08T18:16:16.447 に答える