2015-04-15 4 views
2

Клиент получил error 1298: This operation has been rate limited Ошибка от CloudKit при загрузке записей с CKQueryOperation, только один раз, во время проверки Apple. Как я могу исправить эту проблему?Ошибка CKQueryOperation: эта операция была ограничена по скорости

Здесь не является кодом, ничего особенного:

let query = CKQuery(recordType: "Movie", predicate: NSPredicate(format: "creationDate > %@", d!)) 
let qo = CKQueryOperation(query: query) 
let fb: (CKRecord!) ->() = {record in 

    temporaryContext.performBlockAndWait({ 

     let fr = NSFetchRequest(entityName: "Movie") 
     fr.predicate = NSPredicate(format: "recordName = %@", record.recordID.recordName) 

     let a = temporaryContext.executeFetchRequest(fr, error: nil) as! [Movie] 
     if a.count == 0 { 

      let m = NSEntityDescription.insertNewObjectForEntityForName("Movie", inManagedObjectContext: temporaryContext) as! Movie 
      m.title = record.valueForKey("title") as! String 
      m.image = (record.valueForKey("image") as! CKAsset).fileURL.description 
      m.imageSize = Int32(record.valueForKey("imageSize") as! Int) 
      m.recordName = record.recordID.recordName 
     } 
    }) 
} 

let c:()->() = { 

    temporaryContext.performBlockAndWait({ 
     let success = temporaryContext.save(nil) 
    }) 

    Utility.managedObjectContext().performBlockAndWait({ 

     let success = Utility.managedObjectContext().save(nil) 
    }) 

    NSUserDefaults.standardUserDefaults().setBool(true, forKey: "moviesDownloaded") 
    NSUserDefaults.standardUserDefaults().synchronize() 

    dispatch_semaphore_signal(self.sema) 
} 

let cb: (CKQueryCursor!, NSError!) ->() = {cursor, error in 

    if error == nil { 

     if cursor != nil { 

      let qo2 = Utility.qo(cursor, recordFetchedBlock: fb, completion: c) 
      publicDatabase.addOperation(qo2) 

     } else { 

      c() 
     } 

    } else { 
     Utility.log("error 1298: \(error.localizedDescription)") 

     dispatch_sync(dispatch_get_main_queue(), { 
      self.status.backgroundColor = UIColor.orangeColor() 
     }) 

     NSThread.sleepForTimeInterval(0.5) 

     dispatch_semaphore_signal(self.sema) 
    } 
} 

qo.recordFetchedBlock = fb 
qo.queryCompletionBlock = cb 
publicDatabase.addOperation(qo) 

dispatch_semaphore_wait(self.sema, DISPATCH_TIME_FOREVER) 

Я пытаюсь поставить весь этот код в цикл, как:

for i in 1 ... 2 { 
var rateLimited = false 

... 
if error == nil { 

} else { 

    NSThread.sleepForTimeInterval(3) 
    rateLimited = true 
} 
... 

if !rateLimited { 

    break 
} 
} 

Как вы думаете, он будет работать?

ответ

9

Если вы получили CKErrorRequestRateLimited, ошибка будет иметь ключ CKErrorRetryAfterKey в словаре userInfo ошибки. Вы должны подождать, по крайней мере, столько времени, прежде чем повторять свою операцию.

Ожидание сна - это плохая идея, потому что это может вызвать неожиданные зависания в вашем приложении, особенно если этот код работает в основном потоке. Используйте dispatch_after или NSTimer для повторной отправки вашей операции.

3

Вы также получите эту ошибку, если вы не вошли в свою учетную запись iCloud.

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

  • Нет связанных вопросов^_^