到目前为止,我想出了以下解决方案:
//Assume context, entityName, nameOfRelationship,etc... to be properly defined
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:entityName];
NSArray *fetchResult = [self.context executeFetchRequest:fetchRequest error:&error];
NSArray *deletedObjects = [fetchResult filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
id relationship = [evaluatedObject changedValues][nameOfRelationship];
return relationship && ![relationship containsObject:self.currentUser];
}]];
NSArray *insertedObjects = [fetchResult filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
id relationship = [evaluatedObject changedValues][nameOfRelationship];
return relationship && [relationship containsObject:self.currentUser];
}]];
在这一点上,我有 2 个插入和删除数组(我知道,我在我的问题中说过集合......虽然现在这有效)。不过,我观察到的一个问题是,要使其正常工作,我需要首先从服务器检索数据,将其解析为托管对象,将这些托管对象置于其适当的“默认”关系中,然后进行上下文保存。只有在上下文保存之后才会changedValues
反映更改,例如删除或插入对象(如果默认情况下未插入)。
现在真正的问题是-save:
上下文中的 a 保存了所有对象。因此,例如,如果我有 2 个实体,每个实体都有关系(即 2 个独立的实体,每个实体都有不同的关系,我的所有示例都适用于这两个实体),如果我通过上面的代码,然后发出 POST 和 DELETE 请求,然后保存上下文,以便此时这些对象被“提交”,尝试下一步对另一个实体执行相同操作,并且它的关系将失败,因为上下文保存清除了所有对象的 changedValues。