【问题标题】:CloudKit: Order query results by creation dateCloudKit:按创建日期排序查询结果
【发布时间】:2015-03-31 19:31:40
【问题描述】:

从 CloudKit 加载项目时,我想按创建日期对结果进行排序。我相信现在它是按记录的第一个属性排序的。

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)")
        }
    }
}

【问题讨论】:

  • 我假设我需要使用 NSSortDescriptor,但我不确定具体如何。
  • 接近了吗? query.sortDescriptors = NSSortDescriptor(key: "creationDate", ascending: true)

标签: ios swift icloud cloudkit


【解决方案1】:

这就是我要找的东西:

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

【讨论】:

  • 这不是倒序排列吗?我认为下面@vomako 的答案更好。
【解决方案2】:

这是一个 Objective-C 解决方案。它在 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]];

这样,您可能会收到以下错误消息:

CKError 0x12e874f10:“无效参数”(12/2016);服务器消息 = "字段 '___createTime' 未标记为可排序"; uuid = 468AC2A4-24D6-4A56-81BB-6A2A8027DC15;容器 ID = "iCloud.com.xxx"

所以,只需让它在仪表板中可排序:

【讨论】:

  • 这应该是公认的答案,这个答案的第二部分很关键。
【解决方案3】:

斯威夫特 - 3.0

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

【讨论】:

    【解决方案4】:

    您可以使用 NSPredicate。你是对的。

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

    但是您必须启用 CloudKit 中的 creationDate 字段才能进行查询,以便您可以在查询中使用它们。

    【讨论】:

    • 嗯,我一定是做错了什么。它仍然由另一个属性订购。我为“创建日期”元数据索引启用了查询和排序。
    • 是的,前两行如下所示:let startDate = NSDate(timeInterval: -60.0 * 120, sinceDate: NSDate()) let predicate = NSPredicate(format: "creationDate > %@", startDate)
    • (我假设 date 在上面的代码中应该是 startDate
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2014-06-04
    • 2015-05-08
    • 2015-11-06
    • 1970-01-01
    相关资源
    最近更新 更多