Cloud Kit 핵심 데이터 레코드 쿼리

Sep 03 2020

CloudKit을 사용하여 핵심 데이터를 저장하여 장치간에 동기화 할 수 있도록 마이그레이션하려는 앱이 있습니다.

동기화가 제대로 작동하고 있는데 문제는 앱이 일부 초기 데이터를 데이터베이스에 추가한다는 것입니다. 이로 인해 다른 장치에 설치할 때 데이터가 복제됩니다. 현재는 첫 번째 실행이 수행 된 경우 사용자 기본값을 사용하여 bool을 로컬에 저장하고 있는데, 이는 분명히 장치별로 만 작동합니다.

데이터가 이미 클라우드에 있는지 확인하고 초기 데이터 추가를 방지 할 수있는 방법이 있습니까?

애플의 문서는 객체가 이미 존재하지만 처음 시작할 때 로컬 상점에 객체가없는 경우 가능하다고 제안합니다. https://developer.apple.com/documentation/coredata/mirroring_a_core_data_store_with_cloudkit/reading_cloudkit_records_for_core_data

답변

1 SteveB Sep 04 2020 at 15:00

두 장치가 동일한 CloudKit 로그인을 사용한다고 가정하고 확인하려는 데이터가 사용자 레코드에 저장되어 있으면 다음을 수행 할 수 있습니다.

  1. 해당 사용자의 CloudKit ID 확보
func iCloudUserIDAsync(complete: @escaping (_ instance: CKRecord.ID?, _ error: NSError?) -> ()) {
        let container = CKContainer.default()
        container.fetchUserRecordID() {
            recordID, error in
            
            if let error = error {
               //handle
            } else {
                self.userRecordID = recordID
                complete(recordID, nil)
            }
        }
    }
  1. 그런 다음 해당 ID를 사용하여 사용자를 다시 가져올 때 CloudKit을 쿼리합니다.
CKContainer.default().publicCloudDatabase.fetch(withRecordID: userRecordID) { (results, error ) in
     if results != nil {
         //got the user record, do what you want with it
     }
     if let error = error {
         //handle error
     }
}

또는 데이터가 사용자 레코드에없는 경우 CKQueryOperation 및 조건자를 사용하여 쿼리를 수행 할 수 있습니다. 여기에 좋은 자습서 : https://www.raywenderlich.com/4878052-cloudkit-tutorial-getting-started