2011-01-19 8 views
21

karşılaştırması NSManagedObjects dizisi boyunca döngü yapan ve bir örnek değişkeninde saklanan belirli bir kayıt bulduğunda durduğum bazı kodlar var. Aynı kayıt olup olmadığını görebilmemin tek yolu (eşdeğer bir kayıt değil, belirli bir kayıt), objectID'lerin URIRepresisyonlarını karşılaştırarak. Bu kesinlikle bunu yapmanın en iyi yolu olamaz. Ben yapıyorum:İki NSManagedObjects

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

Aşağıdaki kod ben objectIDs NSLog ve tam olarak aslında aynı olduğunu görmek bile maçları olmadı.

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

Bu durumda, isEqualTo çağrısı: [obj1 objectID] == [obj2 objectID] ile aynıdır, çünkü NSManagedObjectID, geçersiz kılınır :. Aynı nesneyi, her iki çağrıdan da YES'i döndürmesi için almanız gerekir. – ughoavgfhw

cevap

19

yorumcu, isEqualTo doğrudur: onlar NSManagedObjectID farklı örneklerini olduğundan bu durumda çalışmaz.

Bunu yaptığınız yol aslında en iyi yoldur, objectID belirli bir yönetilen nesne için CoreData'nın benzersiz tanımlayıcısıdır; bu, iki farklı NSManagedObject örneğinin kalıcı depoda aynı kayda işaret edip etmediğini anlamanın tek yoludur.

12

Açıklama:

ImHuntingWabbits isEqual: atıfta ama sonra aslında isEqualTo: kullanan ilk örnekte, sopa ile Nick önerir.

Peter Hosey adlı kullanıcının (isEqual vs isEqualTo numaralı yazının yorumuna göre bir fark ve isEqual: numaralı telefonu kullanarak daha iyiyseniz).

Mevcut iletileri takiben, orijinal olarak Cocoa'da iyi çalışan objectID URL'lerini karşılaştırmak için isEqualTo: numaralı telefonu kullandım, ancak bu kodu iOS'a taşıdığımda "NSURL, isEqualTo'ya yanıt vermeyebilir" uyarısı aldım. isEqual: olarak değiştirdiğimde, uyarılar gitti. Eğer bu örnekleri takip ediyorsanız

Yani, muhtemelen bu yapmalıyım: -isEqual

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

Aslında hala isEqual ve sadece nesne kimliklerini kullanmak istiyor. URI Temsili kullanımı çok daha yavaştır. – ImHuntingWabbits

6

: CoreData içinde NSManagedObjectID için doğru uygulamaya konmuştur. Koleksiyonları -kapalılarla kullanıyoruz: her zaman. Özgün posterin kafası karışmış gibi görünüyor -isEqual: -isEqualTo ile: İkincisi kullanılmamalıdır.

+0

"her zaman kullan" iyi bir argümandır. :-) – Andy