【发布时间】:2015-03-19 09:17:16
【问题描述】:
以下简化方法中的CKFetchRecordChangesOperation 不返回任何记录。 我用 nil 调用它,最初获取所有记录,但它只返回服务器令牌。 但是,如果我使用 CKQuery,我会正确获取所有记录。
我错过了什么?
func fetchChangedRecords(token :CKServerChangeToken?) {
println("\(__FUNCTION__) token: \(token)")
let zoneID = CKRecordZoneID(zoneName: kMyZone, ownerName: CKOwnerDefaultName)
var op = CKFetchRecordChangesOperation(recordZoneID: zoneID, previousServerChangeToken: token)
op.recordChangedBlock = {
record in
println("\(__FUNCTION__) record \(record)")
}
op.recordWithIDWasDeletedBlock = {
recordID in
println("\(__FUNCTION__) record \(recordID)")
}
op.fetchRecordChangesCompletionBlock = {
serverChangeToken, clientChangeToken, error in
println("\(__FUNCTION__) server token \(serverChangeToken), clientChangeToken \(clientChangeToken)")
if let err = error {
println("\(__FUNCTION__) Error: \(err)")
}
if op.moreComing {
println("\(__FUNCTION__) moreComing")
self.fetchChangedRecords(serverChangeToken)
}
}
println("\(__FUNCTION__) op \(op)")
privateDB.addOperation(op)
}
编辑:
因此,我使用基于 moreComing 值的附加方法调用更新了代码。下面是打印的内容。我还检查了该区域是否存在。
moreComing 似乎没有设置。
fetchChangedRecords token: nil
fetchChangedRecords op <CKFetchRecordChangesOperation: 0x16dd3e30; operationID=14A302B7-2718-4E05-97C7-B28EC01ED75B>
fetchChangedRecords server token <CKServerChangeToken: 0x16ddfd80; data=AQAAAAAAAAACf/////////+p9bdUdAhLUK36bhza7+4g>, clientChangeToken nil
只是为了表明该区域在那里。
zone fetching succeeded [<CKRecordZone: 0x16dda330; zoneID=MyZone:__defaultOwner__, capabilities=(Atomic,Sync)>, <CKRecordZone: 0x16d5bb70; zoneID=_defaultZone:__defaultOwner__, capabilities=(none)>]
【问题讨论】:
-
代码对我来说看起来是正确的。你能附上运行这段代码的输出吗?如果
moreComing == YES在完成块中,您需要使用更新的更改令牌继续调用CKFetchRecordChangesOperation,直到moreComing == NO -
这很奇怪。您是否介意在启用日志记录的情况下复制此内容并归档雷达或将日志发布到某处?确保同时运行不返回结果的
CKFetchChangesOperation和返回结果的CKQueryOperation。有关启用和获取日志的说明,请参见 developer.apple.com/bug-reporting/ios/icloud/#icloud-drive -
非常感谢您的帮助。事实证明(我很尴尬地承认这一点)问题只是我的所有记录最初都放入了默认区域,然后我忘记了,并试图从自定义区域获取更改的记录。
-
它发生了。很高兴听到一切正常!
-
如果您创建了大量记录并删除了它们,则初始批次可能为空。使用 moreComing 可确保您获得所有当前记录,必要时分几批。