2014-08-27 16 views
12

Attualmente sto scrivendo una semplice app della rubrica in Swift e devo ordinare i risultati da una query CoreData.Ordinamento dei risultati CoreData utilizzando NSPredicate in Swift

Fondamentalmente, ho impostato un NSManagedObject chiamato "Directory", con i nomi dei campi appropriati in - ad es. "name_f" è il nome dell'utente.

I nomi nel database CoreData interrogato sono in ordine alfabetico. Tuttavia, sebbene la prima ricerca restituisca i risultati in ordine alfabetico, a volte le ricerche successive non avvengono dopo che il database è stato interrogato da altre aree del programma. Non sono sicuro del motivo, ma voglio inserire il codice per ordinare attivamente l'array restituito da qualunque campo.

Il mio codice che restituisce l'array NSManagedObject è la seguente:

func SearchName(nameToSearch: String) -> NSArray { 
    let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
    let context:NSManagedObjectContext = appDel.managedObjectContext! //I added the ! 

    let request = NSFetchRequest(entityName: "Directory") 
    request.returnsObjectsAsFaults = false  //will return the instance of the object 

    //request.predicate = NSPredicate(format: "name_f = %@", nameToSearch) 
    //request.predicate = NSPredicate(format: "name_f MATCHES '.*(\(nameToSearch)).*'") 
    request.predicate = NSPredicate(format: "name_f MATCHES[cd] '(\(nameToSearch)).*'") 
    var results:NSArray = context.executeFetchRequest(request, error: nil) 
    return results 
} 

Per inciso, sto utilizzando il seguente codice di tirare un valore specifico dai risultati restituiti (dove searchResult è un'istanza della classe che searchName è in):

var particularEntry = self.searchResult[self.selectedItem] as Directory 
    lblDetailName.text = thisPerson.name_f 

Idealmente, mi piacerebbe essere in grado di: 1 - Modificare il codice di cui sopra al fine di garantire che la matrice 'risultati' è ordinato in modo appropriato. 2 - Identificare il codice che può essere successivamente applicato all'array dei risultati per riordinare in base a qualsiasi campo.

Grazie in anticipo!

+0

Hai avuto uno sguardo alla proprietà 'sortDescriptors' di' NSPredicate'? La "Guida alla programmazione dei dati fondamentali" ha anche molti esempi (in Objective-C), vedere https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdFetching.html#//apple_ref/doc/uid/TP40002484-SW1. –

+0

sortDescriptors è proprietà di NSFetchRequest. Non penso che NSPredicate abbia tali proprietà. – Sandeep

+1

@ insane-36: hai ragione, intendevo NSFetchRequest. –

risposta

38

Grazie - Le righe che seguono sono stati richiesti prima della riga request.predicate:

let sortDescriptor = NSSortDescriptor(key: "name_f", ascending: true) 
let sortDescriptors = [sortDescriptor] 
request.sortDescriptors = sortDescriptors