2015-10-20 24 views
5

Possiedo un array di ID: [INT]. Ora voglio selezionare tutti gli oggetti che hanno questi ID, ma devo seguire l'ordine di identificazione nell'array ID.Ordina per indice di array utilizzando Realm e NSPredicate

let IDs = [2, 6, 3, 4, 10, 9] 
let predicate = NSPredicate(format: "id IN %@", IDs) 
let objects = realm.objects(Item.self).filter(predicate) 

Ma alla fine, gli oggetti sono stati ordinati in modo diverso con ID. C'è un modo per ordinare questi oggetti nell'ordine corretto?

risposta

5

È possibile farlo utilizzando sort():

let IDs = [2, 6, 3, 4, 10, 9] 
let predicate = NSPredicate(format: "id IN %@", IDs)  
do { 
    let realm = try Realm() 
    let objects = realm.objects(Item).filter(predicate).sort({ IDs.indexOf($0.id) < IDs.indexOf($1.id) }) 
} catch {   
} 
+1

Questo approccio materializzare istanze di classe Swift di ogni singolo oggetto corrispondente alla query per eseguire l'operazione di ordinamento. Usa 'Results.sorted (_ :)' per evitare questa materializzazione impaziente. Questo approccio è buono (necessario anche) per l'applicazione di un algoritmo di ordinamento personalizzato non supportato da Realm, tuttavia. – jpsim

+0

Grazie. Questo funziona. Tuttavia, avremo bisogno di materializzare tutti gli oggetti prima di usare .sort. Tuttavia, Results.sorted non è in grado di rilevare l'ordine dell'ID nell'array IDs. – mashix

+0

La domanda ha richiesto un algoritmo di ordinamento personalizzato, quindi non c'è modo di materializzare gli oggetti. – joern

-1

Nel Reame, Results conforme al protocollo RealmCollectionType, che ha una funzione sorted(_:) membro. Questa funzione prende una sequenza di SortDescriptors, che sono StringLiteralConvertible, che li rende molto facile da usare:

let realm = try! Realm() 
let IDs = [2, 6, 3, 4, 10, 9] 
let objects = realm.objects(Item).filter("id IN %@", IDs).sorted(["id"]) 
+0

Ho provato a usare ordinato ("id") ma non è quello che mi serve. Voglio ordinare gli articoli in base all'ordine del loro ID in ID array. – mashix

+2

Vedo. Quindi la risposta di joern è il modo migliore per farlo ora. – jpsim