2015-02-01 6 views
7

Beim Laden von Elementen aus CloudKit möchte ich die Ergebnisse nach dem Erstellungsdatum sortieren. Ich glaube, jetzt sortieren wir nach der ersten Eigenschaft der Platte.CloudKit: Abfrageergebnisse nach Erstellungsdatum sortieren

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

Ich nehme an, ich brauche NSSortDescriptor zu verwenden, aber ich bin mir nicht sicher, wie genau. – colindunn

+0

Ist das nahe? 'query.sortDescriptors = NSSortDescriptor (Schlüssel:" creationDate ", aufsteigend: true)' – colindunn

Antwort

15

ist das, was ich suchte:

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

nicht in umgekehrter Reihenfolge? Ich denke, die Antwort von @vomako ist besser. – PKCLsoft

-1

Sie können NSPredicate verwenden. Du hattest Recht.

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

Aber Sie haben das creation-Feld in dem Wolkenjungen zu ermöglichen, für die Abfrage, damit Sie sie in einer Abfrage verwenden können. Diese

+0

Hm, ich muss etwas falsch machen. Es wird immer noch von einer anderen Eigenschaft bestellt. Ich habe sowohl die Abfrage als auch die Sortierung für die Metadatenindizes "Erstellt am" aktiviert. – colindunn

+0

Haben Sie Ihre 'Let Prädikat' Variable aktualisiert? – Christian

+0

Ja, zuerst zwei Zeilen wie folgt aussehen: 'lassen startdate = NSDate (TimeInterval: -60,0 * 120, sinceDate: NSDate()) let Prädikat = NSPredicate (Format: "creation>% @", startdate)' – colindunn

11

Hier ist ein Objective-C-Lösung. Es funktioniert ähnlich 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]]; 

Damit können Sie die folgende Fehlermeldung:

CKError 0x12e874f10: "Invalid Argument" (12/2016); Server Nachricht = "Feld '___createTime' ist nicht als sortierbar markiert"; uuid = 468AC2A4-24D6-4A56-81BB-6A2A8027DC15; Container ID = "iCloud.com.xxx"

Also, nur um es in Armaturenbrett sortierbar machen: enter image description here

+0

BOOM! Du hast meinen Fehler behoben. – Colas

+0

Dies sollte die akzeptierte Antwort sein, der zweite Teil dieser Antwort ist kritisch. –

0

Swift - 3,0

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