CoreData 및 CloudKit에 대한 내 머리 감싸기

이 블로그 게시물은 https://www.nitricware.com에도 게시되었습니다.

제가 틀린 부분이 있다면 댓글로 남겨주세요!

래퍼와 API가 난독화하는 것을 이해하고 싶습니다. CoreData는 특히 CloudKit과 결합하여 저에게 매우 압도적이었습니다. 그리고 여전히 그렇습니다. 그러나 나는 나를 위해 몇 가지를 정리할 수 있습니다.

무거운 작업을 수행하는 Apple을 선호했기 때문에 "처음부터 전체 코어 데이터 스택을 구축"한 게시물과 자습서가 저를 혼란스럽게 했습니다. 이미 존재하는 것을 이해하고 확장하고 싶었습니다.

iCloud에서 CoreData를 위한 앱 준비


  • 새 응용 프로그램을 생성하고 "CoreData 사용"및 "iCloud에 호스트"를 선택합니다

  • 또는 (앱이 이미 CoreData를 사용한다고 가정합니다. 그렇지 않은 경우 전체PersistenceController를 추가해야 하기 때문입니다.)
  • NSPersitentContainerPersistenceControllerNSPersitentCloudKitContainer로 교체
  • container.viewContext.automaticallyMergesChangesFromParent = truePersistenceController.init()를 마지막 줄
  • 로 추가
  • "서명 및 기능"에서 각 대상에 대해 다음을 추가합니다.
  • 백그라운드 모드: 원격 알림
  • iCloud: CloudKit에서 앱 컨테이너 옆에 있는 확인란을 활성화합니다(필요한 경우 +로 새 컨테이너 생성). 기존 컨테이너를 사용하고 앱 간에 데이터를 공유할 수도 있습니다.


  • 끝났습니다.

    주의: 시뮬레이터의 iCloud 동기화는 기껏해야 불안정합니다. 물리적 장치를 사용하십시오.

    iCloud 컨테이너란 무엇입니까?



    간단히 말해 iCloud 컨테이너는 앱의 모든 클라우드 항목이 있는 iCloud의 디렉토리와 같습니다. NSPersitentCloudKitContainer를 사용하고 있습니까? iCloud 컨테이너에 동기화됩니다. 다중 사용? 여러 구성이 있는 단일 제품입니까? 그들은 모두 거기에 있습니다.

    iCloud 컨테이너는 기기에 있지만 클라우드에 있는 앱의 샌드박스와 같습니다.

    NSPersistentContainer란?



    AnNSPersistentContainer은 데이터베이스(또는 여러 데이터베이스 파일, 참조: 구성)와의 모든 상호 작용을 처리하는 클래스입니다.

    NSPersistentCloudKitContainer는 무엇입니까



    AnNSPersistentCloudKitContainer은 또한 로컬 데이터베이스와의 모든 상호 작용을 처리하고 클라우드와의 동기화도 처리합니다.

    다중 영구 컨테이너



    뭐?



    일반적으로 프로젝트에는 Persistence.swift라는 파일이 있습니다. 또는 PersistenceController 클래스가 다른 곳에서 생성됩니다.

    이것은 PersistenceController 프로젝트의 .sqlite -database(.xcdatamodeld 파일로 정의됨)에 연결하는 영구 컨테이너를 인스턴스화합니다. 이름으로 참조합니다: NSPersistentContainer(name: "MyDataModel") - 작동하려면 MyDataModel.xcdatamodeld가 필요합니다.

    전체 코드를 복사하고 다른 파일을 참조하는 두 번째 컨테이너를 인스턴스화할 수 있습니다.

    그런 다음 AnNSPersistentCloudKitContainer은 두 영구 컨테이너(읽기: 파일)를 iCloud 컨테이너(읽기: sandbox)에 동기화합니다.

    편리하게도 iCloud 기능에서 선택한 iCloud 컨테이너 목록의 첫 번째 iCloud 컨테이너에 간단히 동기화합니다.

    왜요?



    다른 테이블이 아닌 다른 데이터베이스에서 항목을 구분할 수 있습니다. 명확성을 위해. 즉. 냉장고 내용물과 자동차 부품을 저장하는 앱. 유사한 데이터베이스 구조이지만 두 개의 데이터베이스 파일이 의미가 있을 만큼 충분히 다릅니다.

    iCloud 컨테이너에 있는 데이터베이스의 비공개 및 공개 부분에 액세스하려면 NSPersistentCloudKitContainerOptions 및 구성을 사용해야 합니다.

    물론 위의 어리석은 사용 사례에 대한 구성도 사용할 수 있습니다.

    NSPersistentCloudKitContainerOptions 및 구성 사용


    NSPersistentCloudKitContainer를 체크 표시로 표시한 목록의 첫 번째 항목이 아닌 다른 iCloud 컨테이너에 연결한다고 가정해 보겠습니다.

    또는 해당 목록의 첫 번째(또는 다른) iCloud 컨테이너의 공개 및 비공개 레코드를 연결하고 싶습니다.

    그게 바로 NSPersistentCloudKitContainerOptions입니다.

    // point to the database file
    let publicDescription = NSPersistentStoreDescription(url: url!.appendingPathComponent("public.sqlite"))
    
    // point to the container in the cloud
    let publicOptions = NSPersistentCloudKitContainerOptions(containerIdentifier: "iCloud.com.nitricware.Aphrodite")
    
    // point to the section of the container in the cloud
    publicOptions.databaseScope = .public
    
    // link the NSPersistentCloudKitContainerOptions to NSPersistentStoreDescription
    publicDescription.cloudKitContainerOptions = publicOptions
    
    // point to the configuration in your .xcdatamodeld
    publicDescription.configuration = "Public"
    
    // enable uploading already existent entries in your database
    publicDescription.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
    
    // this option enables auto refresh
    publicDescription.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)
    


    추가 자료: https://patmalt.medium.com/end-to-end-encryption-and-cloudkit-with-coredata-part-1-67bfbe467bc

    클라우드 동기화 없이 Core Data에 적용


    NSPersistentContainer를 사용하고 위 코드에서 아래 줄을 생략하십시오.

    let publicOptions = NSPersistentCloudKitContainerOptions(containerIdentifier: "iCloud.com.nitricware.Aphrodite")
    publicOptions.databaseScope = .public
    


    그것에 더 많은 것이 있습니까?



    예. 잔뜩. 매우 복잡한 주제입니다. 나는 아직 모든 것을 이해하지 못한다.

    좋은 웹페이지 즐겨찾기