我们有一个非常强大且充实的系统,可以使用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关系)?
答案 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);
}
}
}
(未经测试,脱离我的头顶,注意拼写错误!)
基本技术是托管对象保留对对象模型描述的引用,您可以在运行时检查它。