2015-05-14 21 views
7

NSString *jabberID özelliği/satırı olan ve bu satırın içindeki her unique değerini almak istiyorum Message/RLMObject modelim var.Realm sorgusuyla benzersiz/ayrı değerleri döndürün

Başka bir deyişle, Message modelimden yinelenmeyen jabberID değerlerini almak istiyorum. Bunu anlamaya yardımcı olan var mı?

Coredata ile kullandığım yöntem, NSFetchRequest'da returnsDistinctResults ayarını kullanıyordu.

cevap

6

Realm'ın henüz farklı sorguları tam olarak desteklemediğini öğrendim. İyi haber şu ki, bu github issue numaralı telefondan bunun için bir geçici çözüm buldum.

RLMResults *messages = [Message allObjects]; 
NSMutableArray *uniqueIDs = [[NSMutableArray alloc] init]; 
NSMutableArray *uniqueMessages = [[NSMutableArray alloc] init]; 
for (Message *msg in messages) { 
    NSString *jabberID = msg.jabberID; 
    Message *uniqueMSG = (Message *)msg; 
    if (![uniqueIDs containsObject:jabberID]) { 
     [uniqueMessages addObject:uniqueMSG]; 
     [uniqueIDs addObject:jabberID]; 
    } 
} 

Swift Swift onu vardır ve Diyar tembel yükleri beri 3,0

let realm = try! Realm() 
let distinctIDs = Set(realm.objects(Message.self).value(forKey: "jabberID") as! [String]) 
var distinctMessages = [Message]() 
for jabberID in distinctIDs { 
    if let message = realm.objects(Message.self).filter("jabberID = '\(jabberID)'").first { 
     distinctMessages.append(message) 
    } 
} 
+0

AllObjects 'Results' koleksiyonunu döndürüyor mu? – ricardopereira

+1

Evet, tüm nesnelerin bir Sonuç topladığını döndürür. –

+0

Anladım, o zaman bu yaklaşım tembel değerlendirmeyi "Sonuçlar" dan kaybedecek. – ricardopereira

12

Fonksiyonel programlama yaklaşımı Amaç-c; en az Swift amaç-C ancak için kolay değildir/edilebilen bir çözelti: GÜNCEL Swift

let distinctTypes = reduce(Realm().objects(User), []) { $0 + (!contains($0, $1.type) ? [$1.type] : []) } 

:

Swift azaltmak bir grup tahsis bir performans tür yoğun ara dizinin yerine, bunun yerine aşağıdakiler çok daha iyi bir performansa sahip olmalıdır, ancak açık bir şekilde

let distinctTypes = Array(Set(Realm().objects(User).valueForKey("type") as! [String]))