2015-08-24 2 views
2

У меня есть 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. Что я мог сделать? После этого у меня есть другие операции, которые зависят от этого запроса. Поэтому мне нужно, чтобы финал попал правильно, прежде чем запускать другие CKOperation.

+0

Как вы инициализируете secondQueryOperation? – Sandeep

+0

Нормальная инициализация 'NSQueryOperation', а затем' secondQueryOperation.addDependency (queryOperation) ' –

ответ

3

Вместо того, чтобы выполнять одну и ту же операцию в другой раз, вы должны создать новую. Ниже вы можете увидеть фрагмент кода от 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) 
} 
Смежные вопросы