인디노트

iCloud의 Key-Value 데이터 디자인하기(iOS & Mac 프로그래밍 가이드) 본문

소스 팁/Objective C, Swift, iOS, macOS

iCloud의 Key-Value 데이터 디자인하기(iOS & Mac 프로그래밍 가이드)

인디개발자 2019. 4. 7. 19:29

원문 : https://swiftcoding.org/icloud-key-value

 

iCloud의 Key-Value 데이터 디자인하기(iOS & Mac 프로그래밍 가이드) | 스위프트코딩

iCloud Design Guide  두 번 째 챕터 번역.스토리지 활성화.Key-Value 충돌 해결하기.데이터 사이즈 제한.NSData객체를 값으로 사용 할 때 주의.앱을 실행 중인 iCloud 계정에 연결된 어떠한 기기에서라도, 해당 계정에 key-value 변경사항을 업로드 할 수 있다. 이러한 변경 사항을 추적하려면 앱을 실행하는 과정에서 알림 수신을 위해 등록한다.

swiftcoding.org

iCloud Design Guide  두 번 째 챕터 번역입니다. 문서 원본: Designing for Key-Value Data in iCloud

 

앱 환경 설정, 앱 구성 또는 앱 상태에 대한 개별 값을 iCloud에 저장하려면 iCloud key-value storage를 사용하라. Key-value storage는 로컬 user defaults 데이터베이스와 유사하다; 하지만 key-value storage에 저장 한 값은 사용자의 여러 기기에있는 당신 앱의 모든 인스턴스에서 사용할 수 있다. 만일 당신앱 인스턴스 하나가 값을 변경하면 다른 인스턴스는 해당 변경 사항을 확인하고 이를 사용하여 구성을 업데이트 할 수 있다 (그림 2-1 참조).

 

아래 그림 2-2에 나타난 것처럼 단일 기기에 대한 key-value storage 상호 작용을 자세히 보면, 앱이NSUbiquitousKeyValueStore 객체를 사용하여 key-value storage에 액세스하는 것을 볼 수 있다.

Figure-2-2 iCloud key-value storage 접근

 

NSUserDefaults 객체에서와 마찬가지로iCloud key-value 저장소를 사용하여 BOOL 같은 스칼라 값과 property-list 객체 타입을 저장하고 검색한다: NSNumber, NSString, NSDate, NSData, NSArray, NSDictionary. 배열과 딕셔너리는 이러한 타입 중 어느 것이라도 담을 수 있다. NSUbiquitousKeyValueStore 클래스는 NSUbiquitousKeyValueStore Class Reference에서 설명한대로 이러한 각 타입을 읽고 쓰는 메소드를 제공한다.

key-value 데이터를 기록할 때마다, 연산은 성공하거나 실패한다(fail atomically). 모든 데이터가 기록되거나 모두 기록되지 않거나이다. 모든 값이 함께 저장되었다는 유효성을 보장하려 할 때이 이런 특성의 장점을 활용할 수 있다: 딕셔너리에 상호간 의존적인 값을 넣고 setDictionary:forKey: 메서드를 호출한다.

 

key-value 스토리지 활성화

key-value storage를 사용할 수 있게 되기 전에, ‘Xcode의 Capabilities를 사용해서 iCloud로의 접근을 요청하기‘에 설명된 것처럼 당신 앱은 반드시 적합한 자격(entitlement)을 가져야한다. 그러면 모든 설정이 완료된다.

 

앱이 iCloud Key-Value 저장을 사용하도록 준비하기

당신앱을 실행 중인 iCloud 계정에 연결된 어떠한 기기에서라도, 해당 계정에 key-value 변경사항을 업로드 할 수 있다. 이러한 변경 사항을 추적하려면 앱을 실행하는 과정에서 NSUbiquitousKeyValueStoreDidChangeExternallyNotification 알림 수신을 위해 등록한다. 그런 다음 사용 가능한 최신 데이터로 앱을 시작하려면 synchronize 메써드를 호출해서 iCloud에서 키와 값을 가져온다 (당신의 앱 디자인이 최대한 빠르게 iCloud에 변경값을 업로드해야할 게 아니라면 애의 라이프사이클 동안 synchronize를 다시 호출할 필요없다. ).

아래의 코드는 앱이 iCloud key-value store를 사용할 수 있게 준비하는 방법을 보여준다. iOS에서는 application:didFinishLaunchingWithOptions: 메써드에, OS X에서는 applicationDidFinishLaunching:메써드 안에 코드를 넣자.

알림 수신 등록 코드

//알림 수신 등록
[[NSNotificationCenter defaultCenter]

    addObserver: self
             selector: @selector (storeDidChange:)
                 name: NSUbiquitousKeyValueStoreDidChangeExternallyNotification
                object: [NSUbiquitousKeyValueStore defaultStore]]; // 당신 앱의 현재 인스턴스가 실행중이지 않을때 일어날 수 있는 변경사항 가져오기 
[[NSUbiquitousKeyValueStore defaultStore] synchronize];

NSUbiquitousKeyValueStoreDidChangeExternallyNotification 알림을 위한 핸들러메써드 안에서 user info 딕셔너리를 살펴봐서 앱의 로컬 user defaults 데이터베이스에 변경사항을 기록할지 결정하자. 다음에 설명 된대로 iCloud에서 발생한 변경 사항을 기반으로 앱 설정을 변경할지 여부를 신중히 결정하는 것이 중요하다.

 

Key-Value 충돌 해결하기

iCloud 계정에 연결된 기기가 key-value storage에 값을 기록하려고할 때 iCloud는 다른 장치에서 key-value storage에 최근 변경된 사항이 있는지 확인한다. 최근에 변경된 사항이 없으면 NSUbiquitousKeyValueStore 객체는 보류중이던 로컬 변경 사항을 서버에 기록한다. 만일 최근 변경되었다면 로컬 값을 서버에 기록하지 않는다. 그 대신, NSUbiquitousKeyValueStoreDidChangeExternallyNotification 알림을 생성해서 업데이트 된 서버 값에 따라 앱을 업데이트하도록 한다.

당신의 NSUbiquitousKeyValueStoreDidChangeExternallyNotification 알림 핸들러가 실행될 때, 서버에서 오는 새 값의 유효성을 검사해서 데이터가 올바른지 확인 할 것. 새 데이터가 앱의 로컬 상태와 일치하지 않으면 다른 기기에서 가져온 데이터가 유효 기간이 지났는지 여부를 고려할 것. 예를 들어, 사용자가 한 장치에서 게임의 레벨 13에 있고 다른 장치에서 레벨 1에있는 경우, 레벨 13으로 설정된 게임의 인스턴스가 변경 사항을 다시 기록하려고 할 수 있다.

 

Key-Value 스토리지의 데이터 사이즈 제한

앱의 iCloud key-value storage에서 사용 가능한 총 공간은 사용자 당 1MB이다.. 지정할 수있는 최대 키 갯수는 1024이며 키와 연관된 각 값의 크기 제한은 1MB이다. 예를 들어, 단일 키에 대해 정확히 1MB의 단일 값을 저장하면 해당 앱 사용자에대한 할당량이 완전히 소비된다. 각 키에 1KB의 데이터를 저장하는 경우 1000 key-value pairs를 사용할 수 있는 것이다.

하나의 key 문자열의 최대 길이는 UTF8 인코딩을 사용하는 64 바이트이다. 누적 키 문자열의 데이터 크기는 iCloud key-value 스토리지의 총 할당량 1MB에 포함되지 않는다. 오히려 사용자의 전체 iCloud 할당에 대해 당신의 key 문자열 (최대 64KB 사용)이 계산된다.

앱이 key-value storage 용량에서 할당량을 초과 한 경우 iCloud key-value 저장소는 NSUbiquitousKeyValueStoreQuotaViolationChange 의 값을 NSUbiquitousKeyValueStoreDidChangeExternallyNotification 알림의 user info 딕셔너리 안에 넣어 보낸다.

당신 앱에서iCloud key-value storage를 사용하는 방법에 대한 자세한 내용은 Preferences and Settings Programming Guide  Storing Preferences in iCloud  NSUbiquitousKeyValueStore Class Reference를 참조.

 

NSData객체를 값으로 사용 할 때 주의

앱의 key-value 저장소에 NSData 객체를 넣을 수 있긴지만 드물게 할 것. 가장 큰 문제는 저장공간이다. 앱은key-value 저장소에 1MB의 데이터 만 저장할 수 있다. 데이터 객체가 잠재적으로 크다면 당신 앱이 저장 용량 한도를 빠르게 초과 할 수 있다. 따라서 1MB 제한에 가까우면 해당 데이터에 대해 document storage을 고려하는 것이 좋다.

대용량 데이터 객체를 조금만 변경할 때마다 전체 데이터 객체를 iCloud에 보내야한다. 많은 데이터를 하나의 데이터 객체로 묶는 대신 데이터를 작은 조각으로 나누고 그 데이터를 개별적으로 저장하는 것이 좋다. 예를 들어 숫자 및 문자열과 같이 더 알기쉬운 데이터 타입을 사용하는 것이 좋다. 다른 타입의 property-list 객체를 사용하여 데이터를보다 세밀하게 저장하면 작은 변경 사항을 적용 할 때 전송해야하는 데이터의 양이 최소화된다.

데이터 객체는 맞춤 객체이기 때문에 당신 앱만 읽을 수 있다. 당신의 데이터 형식을 변경하면 이전 버전의 앱은 새로운 타입을 사용하는 데이터 객체를 읽으려 할 때 앱이 멈출 수 있다. 이전 버전의 앱이 멈추지 않도록하려면 견고성 및 크로스 플랫폼 호환성을위한 설계에서 설명한대로 버전 정보를 데이터 객체에 포함해야 할 수 있다.

특정 상황에서는 Key-Value Storage를 사용하지 말 것

App Store 또는 Mac App Store에 제출 된 모든 앱은 key-value storage을 채택해야하지만 일부 데이터 유형은 key-value 저장에 적합하지 않다. 예를 들어 문서 기반 앱에서 현재 페이지 또는 현재 선택과 같은 각 문서에 대한 상태 정보에 key-value storage를 사용하는 것은 일반적으로 적절하지 않다. 대신, ‘지속되는 문서 상태정보 설계에 설명 된대로 에 필요에 따라 각 문서와 함께 문서 별 상태를 저장하라.

또한 오프라인 일 때에도 앱의 동작에 필수적인 데이터는 key-value storage를 사용하지 말 것. 대신 이러한 데이터는 로컬 user defaults 데이터베이스에 직접 저장할 것.

 

 

반응형
Comments