检测CoreData中的多对多关系更改

时间:2012-05-14 16:55:04

标签: ios core-data many-to-many nsnotifications

我们有一个非常强大且充实的系统,可以使用NSManagedObjectContextObjectsDidChangeNotification检测iOS应用中模型的变化。这适用于我们的属性更改以及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关系)?

1 个答案:

答案 0 :(得分:2)

你是对的:当M:M关系发生变化时,关系两端的对象会显示在NSManagedObjectContextObjectsDidChangeNotification的相应词典中。

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

然后,您可以检查模型以查看是否有任何给定属性:很多或不是:

-(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);
    }
  }
}

(未经测试,脱离我的头顶,注意拼写错误!)

基本技术是托管对象保留对对象模型描述的引用,您可以在运行时检查它。