1

我们有一个非常强大和充实的系统,用于检测我们 iOS 应用程序中模型的变化,使用NSManagedObjectContextObjectsDidChangeNotification. 这适用于我们的属性更改以及 1:1 和 1:M 关系的更改。

我们现在正试图在我们的模式中建立一些 M:M 关系,我正在努力了解 Coredata 的通知系统将如何让我们观察 M:M 关系中的特定变化。

我猜如果 M:M 关系发生变化,则涉及更改的两个对象都将出现在NSUpdatedObjectsKey列表中,但不会有任何特定的注释说明它们之间的 M:M 关系发生了变化,或者是哪个 M:M 关系(假设两个模型之间可能存在多个 M:M 关系)。

有没有人幸运地使用 Coredata 的通知系统来检测 M:M 关系的变化?还是它们基本上难以使用并且人们倾向于将“连接表”明确地创建为真实类型(从而以两个 1:M 关系而不是单个 M:M 关系结束)?

4

1 回答 1

2

你是对的:当 M:M 关系发生变化时,关系两端的对象会出现在NSManagedObjectContextObjectsDidChangeNotification.

如果您正在扫描对象以查找已更改的特定属性,则可以使用该方法changedValues(或者,更好的是,changedValuesForCurrentEvent在 ios5 上)来查找属性名称。你可能已经在这样做了。

然后,您可以检查模型以查看任何给定属性是否为 many:many:

-(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 回答