【问题标题】:Detecting many-to-many relationship changes in CoreData检测CoreData中的多对多关系变化
【发布时间】:2012-05-22 04:47:00
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    然后您可以检查模型以查看任何给定属性是否为 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);
        }
      }
    }
    

    (未经测试,在我脑海中,注意错别字!)

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

    【讨论】:

    • 其实我不知道changedValueschangedValuesForCurrentEvent。谢谢你,他们会做得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多