[英]How do I use CloudKit to query iteratively with CKQueryOperation until cursor is nil?
How would I declare a closure that retrieves records from CloudKit that iteratively calls itself until all the records are fetched? 我如何声明一个从CloudKit检索记录的闭包,该闭包以迭代方式调用自身,直到提取所有记录? The following code does that, except I get an error saying
以下代码可以做到这一点,除了出现错误提示
Variable used within its own initial value
在其初始值内使用的变量
at the line where I assign the closure queryCompletionBlock to the property by that same name of the query operation within the declaration of the closure itself. 在我将闭包queryCompletionBlock分配给属性的那一行中,在闭包本身的声明内使用与查询操作相同的名称。 Basically, I get an error because I call the closure within itself in the declaration of the closure before the closure is declared.
基本上,我得到一个错误是因为在声明闭包之前,我在闭包的声明中在自身内部调用了闭包。
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: DatabaseNameStrings.recordTypeEntry, predicate: predicate)
let queryOperation = CKQueryOperation(query: query)
queryOperation.desiredKeys = [DatabaseNameStrings.fieldNameCreatedAt, DatabaseNameStrings.fieldNameText]
let queryCompletionBlock = {
(cursor: CKQueryOperation.Cursor?, error: Error?) in
if let error = error {
print(error.localizedDescription)
} else if let cursor = cursor {
let queryOperation = CKQueryOperation(cursor: cursor)
queryOperation.desiredKeys = [DatabaseNameStrings.fieldNameCreatedAt, DatabaseNameStrings.fieldNameText]
queryOperation.queryCompletionBlock = queryCompletionBlock // Error message "Variable used within its own initial value"
queryOperationQueue.addOperation(queryOperation)
}
}
queryOperation.queryCompletionBlock = queryCompletionBlock
queryOperationQueue.addOperation(queryOperation)
One option that should work is to reference the queryCompletionBlock
of the original query operation. 一种可行的选择是引用原始查询操作的
queryCompletionBlock
。
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: DatabaseNameStrings.recordTypeEntry, predicate: predicate)
let queryOperation = CKQueryOperation(query: query)
queryOperation.desiredKeys = [DatabaseNameStrings.fieldNameCreatedAt, DatabaseNameStrings.fieldNameText]
let queryCompletionBlock = {
(cursor: CKQueryOperation.Cursor?, error: Error?) in
if let error = error {
print(error.localizedDescription)
} else if let cursor = cursor {
let newOperation = CKQueryOperation(cursor: cursor)
newOperation.desiredKeys = queryOperation.desiredKeys
newOperation.queryCompletionBlock = queryOperation.queryCompletionBlock
newOperationQueue.addOperation(newOperation)
}
}
queryOperation.queryCompletionBlock = queryCompletionBlock
queryOperationQueue.addOperation(queryOperation)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.