Выполнение операции CKQueryOperation несколько раз с новым курсором
У меня есть 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:]: operation is executing and cannot be enqueued
. Что я мог поделать? После этого у меня есть другие операции, которые зависят от этого queryOperation, поэтому мне нужно закончить удар правильно, прежде чем начать другие CKOperation
s.
1 ответ:
Вместо выполнения той же операции в другой раз, вы должны создать новую. Ниже вы можете увидеть фрагмент кода из 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) }