以下只是一個想法,您必須親自闡述。
指定您的密鑰(cardId)爲propertiesToFetch
後,您可以指定只返回NSFetchRequest
的setReturnsDistinctResults
的提取的不同結果。因此,您首先獲取所有不同的對象,然後將結果複製到可變數組中,我將稱其爲distinctArray
。然後,您在查詢所有對象的位置進行第二次提取,因此setReturnsDistinctResults
已禁用到completeArray
。您遍歷distinctArray
的元素並從completeArray
中刪除每個元素。 completeArray
中剩下的將是要刪除的對象。
這個更低層次的實現(可能更高效)將是循環的兩倍。您在取只completeArray
所有對象和做舊的好雙循環:
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];
}
}
}
在年底將有中objectsToDelete
被刪除的所有對象。請注意,如果您的數據庫中有多於兩個同一對象,那麼即使在objectsToDelete
中也可能有重複,因此請在刪除之前對其進行檢查。
感謝您的回答。如果不是objectsToDelete是一個NSMutableArray,而是使它成爲一個NSMutableOrderedSet,這樣對象就不會重複了。然後你可以遍歷數組並刪除所有對象,而不用擔心該數組中的模糊。 – erdekhayser 2013-10-18 22:12:51
NSHipster有一個很好的文章,「我對範圍真棒」的建議是:http://nshipster.com/nsorderedset/ – 2013-11-12 02:00:56
小心使用NSMutableOrderedSet。如果您有兩個具有相同cardID的託管對象,並且您爲其實體獲取所有對象,則獲取結果將包含兩個具有相同cardID的_different_對象,並且它們將在該集合中插入兩次。您應該重寫MO子類中的isEqual方法,以使NSMutableOrderedSet正常工作。 – MrTJ 2013-11-13 09:40:45