2015-04-23 2 views
2

Если CKQueryOperation возвращает ошибку RequestRateLimited, должен ли тот же queryOperation добавлен в publicDatabase или должен быть создан новый запрос на основе полученного курсора? Находит ли клиент курсор, если произошла ошибка RequestRateLimited?RequestRateLimited в CKQueryOperation


@farktronix:

  • вы не должны получить новый курсор запроса
  • можно повторить ту же операцию снова

я реализовал его хорошо, потому что я получаю ошибка (в симуляторе, в условиях плохого интернета)

- [NSOperationQueue addOperation]: операция завершена, и не может быть помещён

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), { 

    // ..other things 

    let qo = CKQueryOperation(query: query) 
    let qcb: (CKQueryCursor!, NSError!) ->() = {cursor, error in 

     if error == nil { 

      //.. some code 

     } else { 

      if error.code == CKErrorCode.RequestRateLimited.rawValue { 

       let retryAfter = error.userInfo![CKErrorRetryAfterKey] as! NSNumber 

       dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(retryAfter.doubleValue * Double(NSEC_PER_SEC))), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 

        publicDatabase.addOperation(qo) // <- HERE is it ok? I get an error 
       }) 
      } else { 

       // .. some other code 
      } 
     } 
    } 

    qo.queryCompletionBlock = qcb 
    publicDatabase.addOperation(qo) 

    // .. other things .. 
}) 

ответ

1

Если вы получите ошибку CKErrorRequestRateLimited, то вы не должны получить новый курсор запроса.

Каждый раз, когда вы получаете ошибку с ограничением скорости, вы можете повторить ту же операцию снова после истечения времени, указанного в словаре пользовательской информации под ключом CKErrorRetryAfterKey.

+0

Я получаю сообщение об ошибке, когда получил ответ «RequestRateLimited», я добавил соответствующий код в вопрос, вы сказали, что мне не нужно создавать новый запрос, но теперь я смущен –

+1

Поскольку «NSOperation» может быть запущен только один раз вам нужно создать новый экземпляр операции со всеми теми же свойствами. Вы можете использовать тот же 'CKQuery' для новой операции. – farktronix

Смежные вопросы