以下は単なるアイデアです。あなた自身でそれを詳しく説明しなければなりません。
キー(cardId)をpropertiesToFetch
と指定した後、setReturnsDistinctResults
がNSFetchRequest
であるフェッチから別個の結果のみを返すように指定することができます。だからあなたはすべての別個のオブジェクトの最初のフェッチを行い、結果を可変配列にコピーする。distinctArray
と呼ぶだろう。次に、setReturnsDistinctResults
が無効にされたcompleteArray
ですべてのオブジェクトを照会する2番目のフェッチを行います。 distinctArray
の要素を繰り返し、各要素をcompleteArray
から削除します。 completeArray
に残っているものは、削除するオブジェクトになります。
これを低レベルで実装すると(おそらくより効率的です)、サイクルの2倍になります。 objectsToDelete
に削除するすべてのオブジェクトがあるだろう終わり
NSMutableArray* objectsToDelete = [[NSMutableArray alloc] initWithCapacity:how_many_duplicates_you_expect];
for (int i = 0; i < [completeArray count]; i++) {
for (j = i + 1; j < [completeArray count]; j++) {
MOObject* objecti = [completeArray objectAtIndex:i];
MOObject* objectj = [completeArray objectAtIndex:j];
if (objecti.cardId == objectj.cardId) {
[objectsToDelete addObject:objectj];
}
}
}
:あなたはcompleteArray
にのみ、すべてのオブジェクトを取得し、古き良きダブルサイクルを行います。 dbに同じオブジェクトが2回以上出現した場合は、objectsToDelete
にも重複が存在する可能性があるので、削除する前に確認してください。
この回答ありがとうございます。 ObjectToDeleteの代わりにNSMutableArrayを使用する場合は、NSMutableOrderedSetを使用してオブジェクトを繰り返さないようにすると効果的です。次に、配列を繰り返し処理して、その配列内の冗長について心配することなく、すべてのオブジェクトを削除することができます。 – erdekhayser
NSHipsterには、「私の範囲内の素晴らしいもの」が何を示唆しているかについての良い記事があります:http://nshipster.com/nsorderedset/ –
NSMutableOrderedSetを注意して使用してください。同じcardIDを持つ2つの管理オブジェクトがあり、そのエンティティのすべてのオブジェクトをフェッチした場合、フェッチ結果には同じcardIDを持つ2つの異なるオブジェクトが含まれ、セットに2回挿入されます。 MOサブクラスのisEqualメソッドをオーバーライドして、NSMutableOrderedSetを正しく動作させる必要があります。 – MrTJ