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
。感谢这一点,它们会做得很好。