0

NSManagedObjects を持つ 2 つの NSSets があります。各セットのオブジェクトは異なるスレッドでフェッチされます。つまり、一致する objectID を持つものもありますが、オブジェクト自体は異なります。ここで、あるセットの managedObjects を別のセットから削除したいと考えています。

NSSet* oldObjects;
NSMutableSet* currentObjects;

// I want to remove the managedObjects in oldObjects from currentObjects, all objects in oldObjects are also in currentObjects

// This doesn't work, since the objects don't match
[currentObjects removeObjectsInArray:[oldObjects allObjects]]; 

// But strangely enough, this doesn't add any objects to currentObjects, but if the objects don't match, shouldn't it?
//[currentObjects addObjectsFromArray:[oldObjects allObjects]];


// This does work for me but this code is running on the main thread and I can see this becoming rather slow for large data sets
NSArray* oldObjectIDs = [[oldObjects allObjects] valueForKey:@"objectID"];
[currentObjects filterUsingPredicate:[NSPredicate predicateWithFormat:@"NOT (objectID IN %@)", oldObjectIDs]];

これらを除外するより速い方法はありますか? この場合でも高速列挙は高速でしょうか?

4

1 に答える 1

0

このような遅れで戻ってきて申し訳ありません。

あなたの質問を読み直しましたが、設定を完全に理解したので、解決策があるかもしれません。

これはテストされていませんが、次のようにしてみてください。

//Since the current objects set has registered its objects in the current context
//lets use that registration to see which of them is contained in the old object set
NSMutableSet* oldRegisteredSet = [NSMutableSet new];
for (NSManagedObject* o in oldObjects) {
    NSManagedObject* regObject = [context objectRegisteredForID:[o objectID]];
    if (regObject) {
        //You could do here instead: [currentObjects removeObject:regObject];
        //You should optimize here after testing performance
        [oldRegisteredSet addObject:regObject];
    }
}

[currentObjects minusSet:oldRegisteredSet];
于 2013-06-21T14:31:27.557 に答える