我正在尝试使用CloudKit和游标从我的iCloud公共数据库下载一批记录。无论resultsLimit如何设置,代码在前3次执行中都工作得很好,但是第四个完成块永远不会执行。如果没有设置resultsLimit,我会得到300条记录;如果设置为50,我会得到150条记录;如果设置为5,我会得到15条记录……
不会报告任何错误,并且该块似乎已添加,但从未执行过。平台是OS X。下面是有问题的代码:
let queryOp = CKQueryOperation(query: query)
queryOp.recordFetchedBlock = self.fetchedDetailRecord
queryOp.resultsLimit = 5
queryOp.queryCompletionBlock = { [weak self]
(cursor: CKQueryCursor!, error: NSError!) -> Void in
println("comp block called with \(cursor) \(error)")
if error != nil {
println("Error on fetch \(error.userInfo)")
} else {
if cursor != nil {
let nextOp = CKQueryOperation(cursor: cursor)
nextOp.recordFetchedBlock = self!.fetchedDetailRecord
nextOp.queryCompletionBlock = queryOp.queryCompletionBlock
nextOp.resultsLimit = 5
self!.publicDatabase?.addOperation(nextOp)
println("added next fetch")
} else {
self!.fileHandle!.closeFile()
self!.exportProgressIndicator.stopAnimation(self)
}
}
}
self.publicDatabase?.addOperation(queryOp)这是来自控制台的结果-
459013587628.012 0 459013587628.621 1 459013587628.863 2 459013587629.113 3 459013587629.339 4通过添加nil调用的comp块459013587828.552 5 459013587828.954 6 459013587829.198 7 459013587829.421 8 459013587829.611 9通过添加nil调用的comp块459013587997.084 10 459013587997.479 11 459013587997.74 12 459013587997.98 13 459013587998.207 14
大数字是调用recordFetchedBlock之间的时间间隔,第二个数字是调用该块的次数。
我是stumped...any关于如何继续下去的想法?容器和publicDatabase是类变量,在运行上面的代码片段之前进行了初始化。
发布于 2015-07-28 06:13:36
在queryCompletionBlock作用域中定义nextOp的方式在该块的三次迭代后会导致问题。如果您将CKQueryOperation的创建过程分解为它自己的方法,那么问题就不复存在了。
代码如下:
func fetchedDetailRecord(record: CKRecord!) -> Void {
println("Retrieved record: \(record)")
}
func createQueryOperation(cursor: CKQueryCursor? = nil) -> CKQueryOperation {
var operation:CKQueryOperation
if (cursor != nil) {
operation = CKQueryOperation(cursor: cursor!)
} else {
operation = CKQueryOperation(query: CKQuery(...))
}
operation.recordFetchedBlock = self.fetchedDetailRecord
operation.resultsLimit = 5
operation.queryCompletionBlock = { [weak self]
(cursor: CKQueryCursor!, error: NSError!) -> Void in
println("comp block called with \(cursor) \(error)")
if error != nil {
println("Error on fetch \(error.userInfo)")
} else {
if cursor != nil {
self!.publicDatabase?.addOperation(self!.createQueryOperation(cursor: cursor))
println("added next fetch")
} else {
self!.fileHandle!.closeFile()
self!.exportProgressIndicator.stopAnimation(self)
}
}
}
return operation
}
func doQuery() {
println("Querying records...")
self.publicDatabase?.addOperation(createQueryOperation())
}发布于 2017-02-10 23:18:37
这可能是另一种方法(已经更新到Swift 3)。
它不会在第三次迭代后停止,而是会一直持续到最后
var queryOp = CKQueryOperation(query: query)
queryOp.recordFetchedBlock = self.fetchedARecord
queryOp.resultsLimit = 5
queryOp.queryCompletionBlock = { [weak self] (cursor : CKQueryCursor?, error : Error?) -> Void in
print("comp block called with \(cursor) \(error)")
if cursor != nil {
let nextOp = CKQueryOperation(cursor: cursor!)
nextOp.recordFetchedBlock = self!.fetchedARecord
nextOp.queryCompletionBlock = queryOp.queryCompletionBlock
nextOp.resultsLimit = queryOp.resultsLimit
//this is VERY important
queryOp = nextOp
self!.publicDB.add(queryOp)
print("added next fetch")
}
}
self.publicDB.add(queryOp)我成功地使用它从CloudKit检索了成百上千条记录
https://stackoverflow.com/questions/31503184
复制相似问题