swift - 使用新游标多次执行 CKQueryOperation

标签 swift cloudkit ckquery

我有一个 CKQueryOperation 处理一千条记录,因此我需要多次执行该操作。我尝试更改光标并添加如下代码所示的操作:

let queryOperation = CKQueryOperation(query: query)
queryOperation.recordFetchedBlock = { (rule: CKRecord) in
        print(rule)
}
queryOperation.database = publicDB
queryOperation.queryCompletionBlock = { (cursor : CKQueryCursor?, error : NSError?) in
    if error != nil {
       print(error?.localizedFailureReason)
    } else {
         if cursor != nil { // The cursor is not nil thus we still have some records to download
            queryOperation.cursor = cursor
            queue.addOperation(queryOperation)
         } else {
              print("Done")
         }
    }
}
// Creation of the dependent operation secondQueryOperation
queue.addOperations([queryOperation, secondQueryOperation], waitUntilFinished: true)

运行时崩溃并返回[NSOperationQueue addOperation:]: 操作正在执行且无法入队。我能做什么?之后我还有其他操作依赖于此 queryOperation,因此我需要在启动其他 CKOperation 之前正确完成操作。

最佳答案

您应该创建一个新操作,而不是再次执行相同的操作。下面您可以看到 EVCloudKitDao 中的代码片段看看如何使用它。

internal func queryRecords<T:EVCloudKitDataObject>(type:T, query: CKQuery, completionHandler: (results: [T]) -> Bool, errorHandler:((error: NSError) -> Void)? = nil) {
    if !(query.sortDescriptors != nil) {
        query.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
    }
    let operation = CKQueryOperation(query: query)
    var results = [T]()
    operation.recordFetchedBlock = { record in
        if let parsed = self.fromCKRecord(record) as? T  {
            results.append(parsed)
        }
    }

    operation.queryCompletionBlock = { cursor, error in
        self.handleCallback(error, errorHandler: errorHandler, completionHandler: {
            if completionHandler(results: results) {
                if cursor != nil {
                    self.queryRecords(cursor!, continueWithResults: results, completionHandler: completionHandler, errorHandler: errorHandler)
                }
            }
        })
    }
    operation.resultsLimit = CKQueryOperationMaximumResults;
    database.addOperation(operation)
}


private func queryRecords<T:EVCloudKitDataObject>(cursor: CKQueryCursor, continueWithResults:[T], completionHandler: (results: [T]) -> Bool, errorHandler:((error: NSError) -> Void)? = nil) {
    var results = continueWithResults
    let operation = CKQueryOperation(cursor: cursor)
    operation.recordFetchedBlock = { record in
        if let parsed = self.fromCKRecord(record) as? T  {
            results.append(parsed)
        }
    }

    operation.queryCompletionBlock = { cursor, error in
        self.handleCallback(error, errorHandler: errorHandler, completionHandler: {
            if completionHandler(results: results) {
                if cursor != nil {
                    self.queryRecords(cursor!, continueWithResults: results, completionHandler: completionHandler, errorHandler: errorHandler)
                }
            }
        })
    }
    operation.resultsLimit = CKQueryOperationMaximumResults;
    database.addOperation(operation)
}

关于swift - 使用新游标多次执行 CKQueryOperation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32189786/

相关文章:

ios - 从 URL Scheme 获取参数 - Swift Xcode

swift - 如何在 Sprite 工具包中创建方形 SKLabelNode

ios - 如何从 cloudkit 中获取所有记录

swift - CloudKit - 使用一种字段类型获取 5 条记录...需要 3-4 秒。为什么这么慢?

cloudkit - CKQuery 的 distanceToLocation 上没有 NSSortDescriptor?

ios - 我可以从 CloudKit 接收与 CKQuery 对应的记录数吗?

Swift Sprite 套件 SKPhyshicsBody

ios - 截断单词末尾的渐变淡出

ios8 - 云套件。订阅问题

ios - CloudKit - 哪些 CKError 应该作为 .partialFailure 处理,它们是否也应该作为非部分故障处理?