2014-10-15 3 views
13

CloudKit을 사용하여 icloud에 저장 한이 문제가 발생하지만 즉시 결과를 가져 오면 삽입 된 최신 데이터가 반환되지 않습니다.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이 성공적으로 완료되면 레코드 ID를 통해 해당 레코드를 즉시 가져올 수 있습니다.

그러나 레코드가 서버의 검색 인덱스에 추가되는 동안 쿼리가 해당 레코드를 즉시 찾지 않습니다.

CKQuery을 사용하여 뷰를 백업하는 경우, 로컬에서 수정 된 레코드의 부가 테이블을 유지하고 쿼리가 해당 레코드를 반환하기 시작할 때까지 해당 레코드를 뷰에 스티치 할 수 있습니다.

+3

Apple docs : "인덱스가 비동기 적으로 업데이트되어 현재 상태가 보장되지 않습니다." 이 페이지에서 https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/CloutKitWebServicesReference/QueryingRecords/QueryingRecords.html – stevex