[iOS] UserDefaults에 대해 알아보자 (standard랑 appGroup차이도!)
1. 유저디폴트가 뭐야?
공식문서를 기반으로 다시 해석해보자
정의는 다음과 같다.
당신의 앱의 열릴때 당신이 저장한 키-값 쌍을 들고있는 유저 디폴트 데이터베이스에 대한 인터페이스를 제공
--이하 해석--
유저 디폴트 클래스는 디폴트 시스템과 상호작용을 하기 위한 프로그래밍 인터페이스를 제공한다.
유저의 프리퍼런스에 맞추어 사용자가 커스터마이징 할 수 있게끔 허용하는 시스템이다.
예를 들어 사용자가 선호하는 측정 단위 또는 미디어 재생 속도를 지정할 수 있다.
위와 같은 예제에서 앱은 유저 디폴트 데이터베이스안에 파라미터들의 셋으로 값을 할당함으로써
프리퍼런스를 보관한다.
매개변수는 일반적으로 앱의 시작상태 혹은 작동하는 방식을 결정하기 때문에 디폴트라고 한다.
런타임 때, 나는 유저 디폴트 데이터베이스로부터 나의 앱에서 사용할 기본값들을 읽기위해 유저 디폴트를 사용한다.
유저 디폴트는 디폴트 값이 필요할 때마다 매 번 여는 것을 방지하기위해 메모리에 캐싱한다.
내가 디폴트 값을 변경하면 내 비즈니스로직과 동기적으로 변경하며(캐싱),
영구 저장소 및 기타 프로세스에 비동기적으로 변경한다(XML파일 혹은 SQLite??).
절대 프리퍼런스 서브시스템에 직접적으로 접근하지마라.
직접 plist파일을 변경하는 것은 변경의 손실, 반영 지연, 앱 크래쉬를 발생시킨다.
프리퍼런스를 변경하기위해 디폴트를 사용해라
교육기관에서 관리되는 디바이스들을 제외하고는
유저 디폴트는 백업 및 복구를 위해 영구적으로 한 디바이스에서만 저장된다.
유저의 연결된 디바이스들과 데이터를 동기화하기 위해서는 NSUbiquitousKeyValueStore를 사용해라!!
2. 디폴트 객체를 보관하는 법
유저 디폴트는 공통 데이터 타입인 float, double, integer, boolean, url 등에 접근할 수 있는 기본 메서드를 제공한다.
컬렉션이나 조합과 같은 것들 대신에 프로퍼티 리스트로 셋될 수 있는 객체여야만한다.
만약 NSData, NSString, NSNumber, NSDate, NSArray, NSDictionary와 같은 형태를 저장하고 싶다면
NSData의 인스턴스를 만들어 이것을 아카이빙시켜야한다.
mutable 값을 셋팅하여도 유저디폴트로부터 반환되는 값들은 immutable이다.
만약에 내가 mutable string을 저장하여도, 이후에 string(forKey:)를 통해 반환받는 값은 immutable이다.
mutable string을 유저 디폴트에 셋하고, 이후에 변경하여도 유저 디폴트에는 반영되지 않는다.
(메모리상에 있는 유저 디폴트에 값을 셋할 때는 call by value로, 무조건 get/set을 통해 처리가 되야한다는 의미같아)
3. 파일 참조를 영구적으로 유지하기
파일 URL을 파일 시스템 내부에 위치를 나타낸다.
set(_:forKey:)메서드를 통해 URL을 유저 디폴트에 저장하여도 유저가 파일을 옮기거나 하면
다음에 열렸을 때는 해당 파일에 접근할 수 없다.
(위와 동일한 맥락같다. 메모리 참조가 아니기 때문에 항상 변경되면 직접 set을 해야하는 상황)
파일 시스템의 Identify를 통해 파일을 참조하고 저장하기 위해서는
NSURL의 북마크 데이터를 아래의 메서드를 통해 생성해라.
bookmarkData(options:includingResourceValuesForKeys:relativeTo:) -> Data
그리고 위에서 나온 데이터를 사용하여 유저 디폴트에 셋을 해라.
그리고 유저 디폴트를 통해 나온 Data를 아래의 메서드를 통해 이동된 파일의 경로를 얻을 수 있다.
URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:
4. 유저 디폴트 변경에 대한 옵저빙
특정 디폴트 값 업데이트의 알림을 KVO를 통해 사용할 수 있다.
또한 로컬 디폴트 데이터베이스의 어떠한 변경에 대한 옵저빙을 DefaultNotification의
didChangeNotification을 등록해서 확인 할 수 있다.
https://developer.apple.com/documentation/foundation/userdefaults/1408206-didchangenotification
Apple Developer Documentation
developer.apple.com
5. UserDefaults의 standard와 appGroup