티스토리 뷰

iOS-Development

UserDefaults

Gobans 2022. 4. 19. 21:34

개요

 프로젝트를 진행하는 중에 앱 내의 데이터를 저장할일이 필요해서 자료를 찾던 도중 UserDefalutsCoreData 두개의 방법을 찾게되었습니다. 현재 프로젝트에서는 많은 데이터 저장이 필요없고, CoreData가 다루기 힘들다는 판단을 하여 이번 프로젝트에서는 UserDefaluts를 사용하기로 결정하였습니다.

 


 

UserDefaluts

An interface to the user’s defaults database, where you store key-value pairs persistently across launches of your app.

 

UserDefaluts란 유저의 데이터를 키 / 값 쌍으로 저장하는 *싱글톤 패턴의 인터페이스 이다.

(*싱글톤 패턴: 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다)

 

floats, doubles, integers, Boolean values, and URLs 와 같은 기본 타입 뿐만아니라 NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary 와 같은 타입들 또한 저장할 수 있다. 만약 이 외의 타입을 저장하고 싶다면 NSData 의 인스턴스를 만들어 저장하면 된다.

 

그래서 제가 필요했던 것은 NSData의 인스턴스를 만들어 저장하고 불러오는 것이였습니다.

 


NSData

 

A static byte buffer that bridges to Data ; use NSData when you need reference semantics or other Foundation-specific behavior.

 

NSData 는 NSObject를 준수하며 Data와 연결하는 bridge 입니다. NSData 는 raw binary data 타입을 사용하고 있기 때문에,  64진법으로 데이터를 저장하고 불러올 수 있습니다.

(*raw binary data를 사용하는 이유: raw binary로 데이터를 저장하지 않으면 데이터 저장 프레임워크에서 모든 사용 데이터 타입을 정의해놓고 써야할 수도 있어서)

 

 


사용법

 

// 데이터 저장
UserDefaluts.standard.set(Any?, forKey: String)

// 데이터 호출
UserDefaults.standard.Any?(forKey: String)

 

기본적인 타입들 (Int, Double, Float, Bool, URL) 은 이렇게 간단하게 타입과 키 문자열을 넣어 저장과 호출을 할 수 있습니다.

 

하지만 유저가 만든 커스텀 오브젝트들 (유저가 정의한 struct, class 등)을 저장하려면 encode와 decode 의 과정을 거쳐야 저장할 수 있습니다.

 

struct Stress : Codable{
    var id : UUID
    var index : Int
    var content : String
    var date : Date
    var category : [String]
    var rewardKey : UUID?
}


extension UserDefaults {
    
    static var stressArray: [Stress]? {
        get {
            var stress: [Stress]?
            if let data = UserDefaults.standard.value(forKey:"stressArray") as? Data {
                stress = try? PropertyListDecoder().decode([Stress].self, from: data)
            }
            return stress ?? []
        }
        set {
            UserDefaults.standard.set(try? PropertyListEncoder().encode(newValue), forKey:"stressArray")
        }
    }
}

 

이 코드에서는 Stress라는 구조체를 정의한 후 UserDefaluts를 extension하여 get set 프로퍼티를 추가해주었습니다. 이 구조체를 리스트로 가지는 stressArray 를 만들어 encode 하고 (set의 동작) 불러올 떄 decode 하여 (get의 동작) 커스텀 오브젝트의 저장과 호출을 쉽게 할 수 있도록 만들었습니다.

 

//get
var sArray : [Stress] = UserDefaults.stressArray ?? []
//set
UserDefaults.stressArray = sArray

 

사용할 떄는 이렇게 쉽게 사용할 수 있습니다.

 

 


Reference

https://developer.apple.com/documentation/foundation/userdefaults

https://developer.apple.com/documentation/foundation/nsdata

https://stackoverflow.com/questions/43268427/what-is-nsdata-or-data-in-swift NSData와 data 가 스위프트에서 무엇인가?

 

'iOS-Development' 카테고리의 다른 글

Lottie  (0) 2022.05.08
CoreData  (0) 2022.04.24
SwiftUI와 Storyboard  (0) 2022.04.03
Swift : 타입  (0) 2022.03.10
Swift : 개요  (0) 2022.03.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함