Ios 检测CoreData中的多对多关系变化

Ios 检测CoreData中的多对多关系变化,ios,core-data,many-to-many,nsnotifications,Ios,Core Data,Many To Many,Nsnotifications,我们有一个非常强大和充实的系统,可以使用NSManagedObjectContextObjectsDidChangeNotification检测iOS应用程序中模型的更改。这适用于属性更改以及1:1和1:M关系中的更改 我们现在正试图将一些M:M关系构建到我们的模式中,我正在努力了解Coredata的通知系统如何允许我们观察M:M关系中的具体变化 我猜想,如果m:m关系发生了更改,那么更改中涉及的两个对象都会出现在NSUpdatedObjectsKey列表中,但是没有任何特定的注释来说明它们之间

我们有一个非常强大和充实的系统,可以使用
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关系)?

您是正确的:当M:M关系更改时,关系两端的对象将显示在
NSManagedObjectContextObjectsIDChangeNotification
中相应的词典中

如果您正在扫描对象以查找已更改的特定属性,则可以使用方法
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);
    }
  }
}
(未经测试,在我的头顶上,注意打字错误!)


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

事实上,我不知道
changedValues
changedValuesForCurrentEvent
。感谢这一点,它们会做得很好。