2014-10-15 3 views
13

У меня возникает эта проблема, когда я сохраняю что-то в icloud с помощью CloudKit, но сразу же при получении результатов не возвращаются последние данные.CloudKit не возвращает самые последние данные

Пример

let todoRecord = CKRecord(recordType: "Todos") 
todoRecord.setValue(todo, forKey: "todotext") 
publicDB.saveRecord(todoRecord, completionHandler: { (record, error) -> Void in 
     NSLog("Saved in cloudkit") 
     let predicate = NSPredicate(value: true) 
     let query = CKQuery(recordType: "Todos", 
      predicate: predicate) 

     self.publicDB.performQuery(query, inZoneWithID: nil) { 
      results, error in 
      if error != nil { 
       dispatch_async(dispatch_get_main_queue()) { 
        self.delegate?.errorUpdating(error) 
        return 
       } 
      } else { 
       NSLog("###### fetch after save : \(results.count)") 
       dispatch_async(dispatch_get_main_queue()) { 
        self.delegate?.modelUpdated() 
        return 
       } 
      } 
     } 

Результат:

Before saving in cloud kit : 3 
CloudKit[22799:882643] Saved in cloudkit 
CloudKit[22799:882643] ###### Count after save : 3 

я упускаю что-то здесь, ребята?

ответ

13

Задержка между тем, когда запись сохраняется в CloudKit, и когда индексы обновлены значениями из этой записи.

Когда CKModifyRecordsOperation успешно завершен, вы можете сразу извлечь эту запись через свой идентификатор записи.

Однако есть задержка, пока запись добавляется к поисковым индексам на сервере, и запросы не найдут эту запись немедленно.

Если вы используете CKQuery для возврата к представлению, вам нужно будет сохранить боковую таблицу записей, которые были изменены локально, и сшить их в представление, пока запрос не начнет возвращать эту запись.

+3

Apple docs: «Индексы обновляются асинхронно, поэтому они не гарантируются как текущие». С этой страницы: https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/CloutKitWebServicesReference/QueryingRecords/QueryingRecords.html – stevex