【发布时间】:2015-06-18 00:48:44
【问题描述】:
对 Cloudkit 私有默认区域的查询结果是否有任何限制?我不知道为什么我只收到带有以下查询的前 100 条记录:
let p = NSPredicate(format: "(type == 'entered') AND (timestamp >= %@) AND (timestamp <= %@)", from, to)
let q = CKQuery(recordType: self.beaconRecordType, predicate: p)
q.sortDescriptors = [NSSortDescriptor(key: "timestamp", ascending: true)]
self.privateDatabase?.performQuery(q, inZoneWithID: nil, completionHandler: { results, error in
//count = 100
println(results.count)
}
好的。正如 Edwin 在回答中提到的那样,解决方案是使用 CKQueryOperation 来获取初始数据块,然后使用 completionBlock 中的“光标”来触发另一个操作。这是一个例子:
更新
func fetchBeacons(from:NSDate, to:NSDate) {
let p = NSPredicate(value: true)
let q = CKQuery(recordType: self.beaconRecordType, predicate: p)
let queryOperation = CKQueryOperation(query: q)
queryOperation.recordFetchedBlock = fetchedARecord
queryOperation.queryCompletionBlock = { [weak self] (cursor : CKQueryCursor!, error : NSError!) in
if cursor != nil {
println("there is more data to fetch")
let newOperation = CKQueryOperation(cursor: cursor)
newOperation.recordFetchedBlock = self!.fetchedARecord
newOperation.queryCompletionBlock = queryOperation.queryCompletionBlock
self!.privateDatabase?.addOperation(newOperation)
}
}
privateDatabase?.addOperation(queryOperation)
}
var i = 0
func fetchedARecord (record: CKRecord!) {
println("\(NSDate().timeIntervalSinceReferenceDate*1000) \(++i)")
}
【问题讨论】:
-
好的。我找到了这个。 stackoverflow.com/a/27135836/893771 。不过,一段代码会有很大帮助。
-
This answer to a similar question还展示了如何保持对
queryOperation的强烈引用,以防止您的提取在不完整时结束。 -
此解决方案将导致操作仅运行 3 次!请改用:stackoverflow.com/a/31664231/530884
标签: ios swift nspredicate cloudkit ckquery