1

を使用して iOS アプリのモデルの変更を検出するための、かなり堅牢で肉付けされたシステムがありますNSManagedObjectContextObjectsDidChangeNotification。これは、属性の変更だけでなく、1:1 および 1:M の関係の変更にも適しています。

現在、スキーマにいくつかの M:M 関係を構築しようとしていますが、Coredata の通知システムを使用して、M:M 関係の特定の変更をどのように監視できるかを確認するのに苦労しています。

M:M 関係が変更された場合、変更に関係する 2 つのオブジェクトが両方ともNSUpdatedObjectsKeyリストに表示されると推測していますが、それらの間の M:M 関係が変更されたことを示す特定の注釈はありません。どの M:M 関係であったか (2 つのモデル間に複数の M:M 関係が存在する可能性があると仮定)。

Coredata の通知システムを使用して M:M 関係の変化を検出できた人はいますか? それとも、それらを扱うのは基本的に難しく、人々は「結合テーブル」を実数型として明示的に作成することに頼る傾向がありますか (その結果、単一の M:M 関係ではなく 2 つの 1:M 関係になります)。

4

1 に答える 1

2

その通りです。M:M 関係が変更されると、関係の両端にあるオブジェクトが の適切なディクショナリに表示されますNSManagedObjectContextObjectsDidChangeNotification

変更された特定のプロパティを探してオブジェクトをスキャンしている場合は、メソッドchangedValues( changedValuesForCurrentEventiOS5 ではより適切) を使用してプロパティ名を見つけることができます。あなたはおそらくすでにこれを行っています。

次に、モデルを調べて、特定のプロパティが多対多かどうかを確認できます。

-(void)notifyObjectsChanged:(NSNotification *)note
{
  assert([NSManagedObjectContextObjectsDidChangeNotification isEqual:note.name]);
  for (NSManagedObject *mo in [note.userInfo objectForKey:NSUpdatedObjectsKey])
  {
    NSLog(@"for %@ :", mo.objectID);
    NSDictionary *rels = mo.entity.relationshipsByName;
    for (NSString *prop in [mo.changedValuesForCurrentEvent allKeys])
    {
      NSRelationshipDescription *rel = [rels objectForKey:prop];
      if (rel.isToMany && rel.inverseRelationship.isToMany)
        NSLog(@"many-to-many relationship %@ changed", prop);
    }
  }
}

(テストされていない、私の頭の上から、タイプミスに気をつけてください!)

重要なテクニックは、マネージド オブジェクトがオブジェクト モデル記述への参照を保持し、実行時に検査できるようにすることです。

于 2012-05-15T03:21:36.933 に答える