CoreData 및 CloudKit에 대한 내 머리 감싸기
제가 틀린 부분이 있다면 댓글로 남겨주세요!
래퍼와 API가 난독화하는 것을 이해하고 싶습니다. CoreData는 특히 CloudKit과 결합하여 저에게 매우 압도적이었습니다. 그리고 여전히 그렇습니다. 그러나 나는 나를 위해 몇 가지를 정리할 수 있습니다.
무거운 작업을 수행하는 Apple을 선호했기 때문에 "처음부터 전체 코어 데이터 스택을 구축"한 게시물과 자습서가 저를 혼란스럽게 했습니다. 이미 존재하는 것을 이해하고 확장하고 싶었습니다.
iCloud에서 CoreData를 위한 앱 준비
또는 (앱이 이미 CoreData를 사용한다고 가정합니다. 그렇지 않은 경우 전체
PersistenceController
를 추가해야 하기 때문입니다.)NSPersitentContainer
의 PersistenceController
를 NSPersitentCloudKitContainer
로 교체container.viewContext.automaticallyMergesChangesFromParent = true
에 PersistenceController.init()
를 마지막 줄+
로 새 컨테이너 생성). 기존 컨테이너를 사용하고 앱 간에 데이터를 공유할 수도 있습니다. 끝났습니다.
주의: 시뮬레이터의 iCloud 동기화는 기껏해야 불안정합니다. 물리적 장치를 사용하십시오.
iCloud 컨테이너란 무엇입니까?
간단히 말해 iCloud 컨테이너는 앱의 모든 클라우드 항목이 있는 iCloud의 디렉토리와 같습니다.
NSPersitentCloudKitContainer
를 사용하고 있습니까? iCloud 컨테이너에 동기화됩니다. 다중 사용? 여러 구성이 있는 단일 제품입니까? 그들은 모두 거기에 있습니다.iCloud 컨테이너는 기기에 있지만 클라우드에 있는 앱의 샌드박스와 같습니다.
NSPersistentContainer란?
An
NSPersistentContainer
은 데이터베이스(또는 여러 데이터베이스 파일, 참조: 구성)와의 모든 상호 작용을 처리하는 클래스입니다.NSPersistentCloudKitContainer는 무엇입니까
An
NSPersistentCloudKitContainer
은 또한 로컬 데이터베이스와의 모든 상호 작용을 처리하고 클라우드와의 동기화도 처리합니다.다중 영구 컨테이너
뭐?
일반적으로 프로젝트에는
Persistence.swift
라는 파일이 있습니다. 또는 PersistenceController
클래스가 다른 곳에서 생성됩니다.이것은
PersistenceController
프로젝트의 .sqlite
-database(.xcdatamodeld
파일로 정의됨)에 연결하는 영구 컨테이너를 인스턴스화합니다. 이름으로 참조합니다: NSPersistentContainer(name: "MyDataModel")
- 작동하려면 MyDataModel.xcdatamodeld
가 필요합니다.전체 코드를 복사하고 다른 파일을 참조하는 두 번째 컨테이너를 인스턴스화할 수 있습니다.
그런 다음 An
NSPersistentCloudKitContainer
은 두 영구 컨테이너(읽기: 파일)를 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
그것에 더 많은 것이 있습니까?
예. 잔뜩. 매우 복잡한 주제입니다. 나는 아직 모든 것을 이해하지 못한다.
Reference
이 문제에 관하여(CoreData 및 CloudKit에 대한 내 머리 감싸기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/nitricware/wrapping-my-head-around-coredata-and-cloudkit-4obn텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)