CloudKit没有返回最新的数据。

16

我遇到了一个问题,我使用CloudKit将一些内容保存到iCloud上,但是立即获取结果时不会返回最新插入的数据。

示例

let todoRecord = CKRecord(recordType: "Todos")
todoRecord.setValue(todo, forKey: "todotext")
publicDB.saveRecord(todoRecord, completionHandler: { (record, error) -> Void in
        NSLog("Saved in cloudkit")
        let predicate = NSPredicate(value: true)
        let query = CKQuery(recordType: "Todos",
            predicate:  predicate)

        self.publicDB.performQuery(query, inZoneWithID: nil) {
            results, error in
            if error != nil {
                dispatch_async(dispatch_get_main_queue()) {
                    self.delegate?.errorUpdating(error)
                    return
                }
            } else {
                NSLog("###### fetch after save : \(results.count)")
                dispatch_async(dispatch_get_main_queue()) {
                    self.delegate?.modelUpdated()
                    return
                }
            }
        }

结果:

Before saving in cloud kit : 3
CloudKit[22799:882643] Saved in cloudkit
CloudKit[22799:882643] ###### Count after save : 3

我在这里漏掉了什么吗?

1个回答

20

在CloudKit中,当记录被保存后,更新索引的值与记录保存之间存在一定的延迟。

当一个CKModifyRecordsOperation完成后,您可以立即通过其记录标识符获取该记录。

然而,当记录添加到服务器的搜索索引中时,会有一定的延迟,并且查询不会立即找到该记录。

如果您使用CKQuery来支持视图,则需要保留一张本地已修改的记录侧表,并将其拼接到视图中,直到查询开始返回该记录为止。


更新文档链接:https://developer.apple.com/documentation/cloudkit/ckqueryoperation/1515283-recordfetchedblock - ethanhuang13
我也曾经吃过这个亏。这个答案是我见过的最好的。然而,是否有一种方法可以在iCloud完成其操作时得到通知,或者是否有一种CKQuery可以捕获我们知道已成功保存的新记录。我注意到,在删除后进行CKQuery可以完美地工作。 - KenM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接