2015-02-01 13 views
7

Quando carichi elementi da CloudKit, desidero ordinare i risultati per data di creazione. Credo che ora stia selezionando la prima proprietà del disco.CloudKit: ordina i risultati della query per data di creazione

func loadItems() { 
    let predicate = NSPredicate(value: true) 
    let query = CKQuery(recordType: "Items", predicate: predicate) 
    db.performQuery(query, inZoneWithID: nil) { (results, error) -> Void in 
     if error != nil { 
      println(error.localizedDescription) 
     } 

     dispatch_async(dispatch_get_main_queue()) {() -> Void in 
      items = results as [CKRecord] 
      self.tableView.reloadData() 
      println("items: \(items)") 
     } 
    } 
} 
+0

presumo ho bisogno di usare NSSortDescriptor, ma io non sono sicuro di quanto specificamente. – colindunn

+0

E 'vicino? 'query.sortDescriptors = NSSortDescriptor (chiave:" creationDate ", ascendente: true)' – colindunn

risposta

15

questo è quello che cercavo:

query.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 
+0

non si ordina in ordine inverso? Penso che la risposta di @vomako qui sotto sia migliore. – PKCLsoft

-1

È possibile utilizzare NSPredicate. Avevi ragione.

let startDate = NSDate(timeInterval: -60.0 * 120, sinceDate: NSDate()) 
let predicate = NSPredicate(format: "creationDate > %@", startDate) 

ma devi abilitare il creationDate-campo nella CloudKit per l'interrogazione in modo da poterli utilizzare in una query.

+0

Hm, devo fare qualcosa di sbagliato. Sta ancora ordinando da un'altra proprietà. Ho abilitato sia query che ordinamento per gli indici di metadati "Data creazione". – colindunn

+0

Hai aggiornato la variabile 'let predicate'? – Christian

+0

Sì, prime due righe simile a questa: 'lasciare startDate = NSDate (TimeInterval: -60.0 * 120, sinceDate: NSDate()) let predicato = NSPredicate (formato: "creationDate>% @", startDate)' – colindunn

11

Qui è una soluzione Objective-C. Funziona allo stesso modo in Swift.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"TRUEPREDICATE"]; 
CKDatabase *privateDatabase = [self.myContainer privateCloudDatabase]; 
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"command" predicate:predicate]; 
query.sortDescriptors = [NSArray arrayWithObject:[[NSSortDescriptor alloc]initWithKey:@"creationDate" ascending:true]]; 

Con questo, si può ottenere il seguente messaggio di errore:

CKError 0x12e874f10: "argomenti non validi" (12/2016); messaggio server = "Campo '___createTime' non è marcato come ordinabile"; uuid = 468AC2A4-24D6-4A56-81BB-6A2A8027DC15; Contenitore ID = "iCloud.com.xxx"

Quindi, basta renderlo ordinabile in plancia: enter image description here

+0

BOOM! Hai risolto il mio bug. – Colas

+0

Questa dovrebbe essere la risposta accettata, la seconda parte di questa risposta è fondamentale. –

0

Swift - 3,0

let recordInsertDate = records["creationDate"]! 
print("recordInsertDate : \(recordInsertDate)") 
let query = CKQuery(recordType: "className", predicate: NSPredicate(format: "creationDate >= %@ " , recordInsertDate as! CVarArg)) 
Problemi correlati