2015-02-01 12 views
7

Khi tải các mục từ CloudKit, tôi muốn sắp xếp kết quả theo ngày tạo. Tôi tin rằng bây giờ nó đang phân loại theo tài sản đầu tiên của hồ sơ.CloudKit: Đặt kết quả truy vấn theo ngày tạo

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

Tôi giả sử tôi cần phải sử dụng NSSortDescriptor, nhưng tôi 'không chắc chắn cách cụ thể. – colindunn

+0

Đây có phải là đóng cửa không? 'query.sortDescriptors = NSSortDescriptor (key:" creationDate ", tăng dần: true)' – colindunn

Trả lời

15

Đây là những gì tôi đang tìm kiếm:

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

không sắp xếp theo thứ tự ngược lại? Tôi nghĩ câu trả lời của @vomako bên dưới là tốt hơn. – PKCLsoft

-1

Bạn có thể sử dụng NSPredicate. Bạn đa đung.

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

Nhưng bạn phải bật trường Tạo trường trong CloudKit để truy vấn để bạn có thể sử dụng chúng trong truy vấn.

+0

Hm, tôi phải làm điều gì sai. Nó vẫn được đặt hàng bởi một tài sản khác. Tôi đã bật cả truy vấn và sắp xếp cho chỉ mục Siêu dữ liệu 'Ngày tạo'. – colindunn

+0

Bạn đã cập nhật biến 'let predicate' chưa? – Christian

+0

Vâng, hai dòng đầu tiên trông giống như sau: 'let startDate = NSDate (timeInterval: -60.0 * 120, sinceDate: NSDate()) để cho biến vị ngữ = NSPredicate (định dạng:" creationDate>% @ ", startDate)' – colindunn

11

Dưới đây là một giải pháp Objective-C. Nó hoạt động tương tự trong 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]]; 

Với điều này, bạn có thể nhận được thông báo lỗi sau:

CKError 0x12e874f10: "Lập luận không hợp lệ" (12/2016); server message = "Field" ___createTime 'không được đánh dấu là có thể sắp xếp "; uuid = 468AC2A4-24D6-4A56-81BB-6A2A8027DC15; ID container = "iCloud.com.xxx"

Vì vậy, chỉ cần làm cho nó sắp xếp trong bảng điều khiển: enter image description here

+0

BOOM! Bạn đã giải quyết được lỗi của tôi. – Colas

+0

Đây phải là câu trả lời được chấp nhận, phần thứ hai của câu trả lời này là rất quan trọng. –

0

Swift - 3,0

let recordInsertDate = records["creationDate"]! 
print("recordInsertDate : \(recordInsertDate)") 
let query = CKQuery(recordType: "className", predicate: NSPredicate(format: "creationDate >= %@ " , recordInsertDate as! CVarArg)) 
Các vấn đề liên quan