これまでのところ、次の解決策を思いつきました。
//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 つの配列があります (質問でセットと言いましたが、これは今のところ機能します)。私が観察した 1 つの問題は、これが機能するためには、最初にサーバーからデータを取得し、それを解析して管理対象オブジェクトに変換し、それらの管理対象オブジェクトを適切な「デフォルト」関係に配置してから、コンテキストを保存する必要があることです。コンテキストの保存後にのみchangedValues
、オブジェクトの削除または挿入などの変更が反映されます (デフォルトで挿入されていない場合)。
本当の問題は-save:
、コンテキストの a がすべてのオブジェクトを保存することです。したがって、たとえば、それぞれが関係を持つ 2 つのエンティティ (つまり、それぞれが異なる関係を持つ 2 つの別個のエンティティであり、すべての例が両方のエンティティに適用される) がある場合、上記のコードを実行すると、POST および DELETE 要求を発行してから、その時点でそれらのオブジェクトが「コミット」されるようにコンテキストを保存し、次に他のエンティティと同じことを行おうとすると、コンテキストの保存によってすべてのオブジェクトの changedValues がクリアされるため、その関係は失敗します。