2011-01-19 154 views
21

我有一些代碼循環訪問NSManagedObjects數組,並在它找到存儲在實例變量中的某個記錄時停止。我可以設法查看它們是否是相同記錄(不是等同記錄,具體記錄)的唯一方法是通過比較對象ID的URIR表示。這肯定不是做這件事的最好方式。我在做:比較兩個NSManagedObjects

if ([[[obj1 objectID] URIRepresentation] isEqualTo: [[_obj2 objectID] URIRepresentation]]) { 
    NSLog(@"Match"); 
} 

即使當我NSLog objectIDs,並看到他們實際上是完全一樣的,下面的代碼永遠不會匹配。

if ([[obj1 objectID] isEqualTo: [_obj2 objectID]]) { 
    NSLog(@"Match"); 
} 
+3

在這種情況下,調用isEqualTo:與[obj1 objectID] == [obj2 objectID]相同,因爲NSManagedObjectID不會覆蓋isEqual :.您將不得不從兩次調用中接收完全相同的對象,以便返回YES。 – ughoavgfhw 2011-01-19 06:47:42

回答

19

評論者是正確的,isEqualTo:在這種情況下不起作用,因爲它們是NSManagedObjectID的不同實例。

你這樣做的方式實際上是最好的方式,objectID是CoreData對於給定託管對象的唯一標識符,它是判斷NSManagedObject的兩個實例是否指向持久性存儲中的相同記錄的唯一方法。

12

澄清:

ImHuntingWabbits指isEqual:,但隨後尼克建議堅持使用他的第一個例子,它實際上使用isEqualTo:

Per Peter Hosey對帖子isEqual vs isEqualTo的評論,有差異,你最好用isEqual:

繼本文之後,我最初使用isEqualTo:來比較在Cocoa中可以正常工作的objectID URL,但是當我將這段代碼移到iOS時,我得到警告「NSURL可能不會響應isEqualTo」。當我更改爲isEqual:時,警告消失了。

所以,如果你按照這些例子,你應該這樣做:

if ([[[obj1 objectID] URIRepresentation] isEqual:[[_obj2 objectID] URIRepresentation]] { 
    NSLog(@"Match"); 
} 
+1

其實他仍然想使用isEqual和只是對象ID。使用URI表示速度要慢很多。 – ImHuntingWabbits 2013-01-23 08:46:51

6

-isEqual:已正確實現NSManagedObjectID在CoreData。我們始終使用帶有-contains的集合。似乎原來的海報混淆了-isEqual:和-isEqualTo:後者不應該被使用。

+0

「一直使用它」是一個很好的論點。 :-) – Andy 2016-12-09 21:37:49