2015-02-01 19 views
7

Podczas ładowania produktów z CloudKit chciałbym zamówić wyniki według daty utworzenia. Wierzę, że teraz sortuje według pierwszej własności płyty.CloudKit: Zamów wyniki zapytania według daty utworzenia

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

zakładam muszę korzystać NSSortDescriptor, ale nie jestem pewien, jak konkretnie. – colindunn

+0

Czy to jest blisko? 'query.sortDescriptors = NSSortDescriptor (klucz:" creationDate ", rosnąco: true)' – colindunn

Odpowiedz

15

To właśnie szukałem:

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

nie sortuje tego w odwrotnej kolejności? Myślę, że odpowiedź @vomako poniżej jest lepsza. – PKCLsoft

-1

Możesz użyć NSPredicate. Miałeś rację.

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

Musisz jednak włączyć pole createDate w CloudKit, aby otrzymywać zapytania, aby można było użyć ich w zapytaniu.

+0

Hm, muszę coś robić źle. Nadal zamawia przez inną nieruchomość. Włączono zarówno zapytania, jak i sortowanie dla indeksów metadanych "Data utworzenia". – colindunn

+0

Czy zaktualizowałeś zmienną 'let predicate'? – Christian

+0

Tak, pierwsze dwie linie wyglądają tak: 'let startDate = NSDate (timeInterval: -60.0 * 120, sinceDate: NSDate()) let predicate = NSPredicate (format:" creationDate>% @ ", startDate)' – colindunn

11

Oto rozwiązanie Objective-C. Działa podobnie w 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]]; 

Z tym, może pojawić się następujący komunikat o błędzie:

CKError 0x12e874f10: "nieprawidłowe argumenty" (12/2016); komunikat serwera = "Pole" ___createTime "nie jest oznaczone jako sortable"; uuid = 468AC2A4-24D6-4A56-81BB-6A2A8027DC15; ID pojemnik = "iCloud.com.xxx"

Więc, po prostu zrobić to sortable w desce rozdzielczej: enter image description here

+0

BOOM! Rozwiązałeś mój błąd. – Colas

+0

To powinna być zaakceptowana odpowiedź, druga część tej odpowiedzi jest krytyczna. –

0

Swift - 3,0

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