UserDefaults를 사용한 Persistent Local Data 저장

silverCastle·2022년 1월 29일
0

예를 들어, '오늘의 할 일'을 적어두는 앱에 오늘 무엇을 할지를 기록하고 있다고 가정하자.
다 기록을 하고 나서 시간이 지난 뒤, 확인하려고 했을 때 기록한 내용이 삭제되었다면 얼마나 허무할 것인가? 이러한 사고를 방지하기 위해 UserDefaults를 사용해 Persistent Local Data를 저장할 수 있다.

[File]-[New]-[Playground]를 클릭하여 Playground에서 연습을 통해 익숙해지려고 한다.

let defaults = UserDefaults.standard

set 메서드를 사용해 Any?, Int, Double, Bool, Float, URL? 데이터 타입을 설정할 수 있다.

defaults.set(Date(), forKey: "AppLastOpendByUser")  // Any?
let appLastOpen = defaults.object(forKey: "AppLastOpendByUser") // Jan 29, 2022 at 10:44 PM
defaults.set("silverCastle", forKey: "PlayerName")  // String
let playerName = defaults.string(forKey: "PlayerName")  // silverCastle
defaults.set(true, forKey: "MusicOn")   // Bool
let musicOn = defaults.bool(forKey: "MusicOn")  // true
defaults.set(0.24, forKey: "Volume")    // Float
let volume = defaults.float(forKey: "Volume")   // 0.24

여기서 array의 경우에는 실질적으로 리턴 타입이 optional 배열이기 때문에 배열 내부에 포함된 원소들의 데이터 타입을 알지 못한다. 따라서 아래와 같이 보다 명시적으로 as!을 사용해 정수형 배열로 다운캐스팅을 할 수 있다.

let array = [1,2,3]
defaults.set(array, forKey: "myArray")  // Any?
let myArray = defaults.array(forKey: "myArray") as! [Int]   // [1,2,3]

UserDefaults가 어디에 저장되어 있는지 알고싶다면
AppDelegatedidFinishLaunchingWithOptions func에서 아래의 print를 넣어서 알 수 있다.

print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as String)

하지만, 많은 양의 데이터를 저장한다면 저장한 모든 항목을 로드해야 하므로 많은 시간이 걸릴 것이다.
UserDefaults는 데이터베이스가 아니라서 앱의 속도와 효율성에 상당한 영향을 미치기 때문에 적은 양의 데이터를 저장하고 싶을 때 사용해야 함을 기억하자.

0개의 댓글