这里有一些建议来实现你想要的。为了清楚起见,我将我的答案分为两部分。第一个涉及流程图的左侧。
左侧部分
当您创建Rep 时,您需要设置其日期(注意 A)。为此,我将覆盖 awakeFromInsert 方法。根据文档
你通常使用这个方法来初始化特殊的默认属性
价值观。该方法在对象的生命周期内只调用一次。
插入新对象后,您应该使用特定谓词对Day 运行获取请求以搜索同一日期。
在这里你不能简单地使用谓词
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(eDate = %@)", selectedDate];
这行不通。而是使用Core Data Predicate Date Comparison 中描述的解决方案。动机是数据 15/03/2014 16:02:00 与 15/03/2014 16:02:01 不匹配。
根据获取请求返回的结果,您将获取数组中的第一个对象(注意 B)并设置关系。相反,您将创建一个新的Day 对象并设置关系。
注意 A 这意味着您已经为 Rep 和 Day 创建了 NSManagedObject 的子类
注意 B 除了找到之外,您还有多少 Days?
右侧部分
对于第二部分,我将依赖 NSManagedObjectContextObjectsDidChangeNotification。此通知对于侦听发生的更改很有用。
当发生更改时,notification 将包含 NSSet 用于删除、插入或更新的对象。
NSSet *updatedObjects = [[notification userInfo] valueForKey:NSUpdatedObjectsKey];
NSSet *deletedObjects = [[notification userInfo] valueForKey:NSDeletedObjectsKey];
NSSet *insertedObjects = [[notification userInfo] valueForKey:NSInsertedObjectsKey];
// Place your logic here...
显然你需要用你的逻辑替换评论。它看起来像以前的。但重要的是过滤通知中返回的对象。您只对Rep 的更改感兴趣。所以,例如
NSSet *objects = nil;
NSMutableSet *combinedSet = nil;
NSPredicate *predicate = nil;
NSDictionary *userInfo = [notification userInfo];
objects = [userInfo valueForKey:NSInsertedObjectsKey];
combinedSet = [NSMutableSet setWithSet:objects];
objects = [[notification userInfo] valueForKey:NSUpdatedObjectsKey];
[combinedSet unionSet:objects];
objects = [[notification userInfo] valueForKey:NSDeletedObjectsKey];
[combinedSet unionSet:objects];
predicate = [NSPredicate predicateWithFormat:@"entity.name == %@,
@"Rep"];
[combinedSet filterUsingPredicate:predicate];
if ([combinedSet count] == 0) {
return;
}
// Place your logic here…
最后,为了维护一致性图,我将使用从Rep 到Day 的级联关系,并取消到Day 到Rep。如果没有附加到任何Rep,这将允许您删除Days 对象。显然,这取决于您的需求。
希望对你有帮助。