โญ๏ธ UserDefault ๋ ?
- iOS์์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ค ํ๋
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ค. ์ฆ ๋ฉ๋ชจ๋ฆฌ ์บ์ฑ์ ํ๋ค.
- ์ฌ์ฉ์์ ์ ๋ณด๋ผ๋๊ฐ ๊ฒ์๋ฌผ์ ๋ํ ์ ๋ณด์ฒ๋ผ ๋์ฉ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ์ฌ์ฉํ์ง ์๊ณ ,
- ์๋ ๋ก๊ทธ์ธ ์ฌ๋ถ, ์์ด๋ ์ ์ฅ, ํ๊ฒฝ์ค์ ์์ ์ค์ ํ๋ ์ค์ ๋ฐ์ดํฐ ๊ฐ(์ฌ์ฉ์๊ฐ ์ ํธํ๋ ์ธก์ ๋จ์๋ ๋ฏธ๋์ด ์ฌ์ ์๋ ๋ฑ) ๊ฐ์ ๋จ์ผ ๋ฐ์ดํฐ ๋ฑ์ UserDefaults๋ก ๋ด์์ ๋ณด๊ด
๊ณต์ ๋ฌธ์ : https://developer.apple.com/documentation/foundation/userdefaults
โญ๏ธ UserDefault ํน์ง
- ๋ฐํ์ ํ๊ฒฝ(์ฑ์ด ์คํ๋๋ ๋์)์์ ๋์, ์ฑ์ด ์คํ๋๋ ๋์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํด key-value์ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ๊ฑฐ๋ ๊ฐ์ ธ์จ๋ค.
- [๋ฐ์ดํฐ(value), ํค(key)]์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- ํค(key)์ ๊ฐ์ String
- ๋ฐ์ดํฐ(value)๋ ๋ชจ๋ ๊ฐ์ฒด ๊ฐ๋ฅ
- ์ฐ๋ฆฌ๊ฐ iOS์ ์ฑ์ ์ค์นํ๋ฉด ์ฑ์ด ์คํ๋๋ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์ฑ๋๋ค.
- ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ Property List๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, .plist ํ์ผ์ xml ํ์์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค.
- ์ด plist ํ์ผ์ SandBox ๋ด์ Bundle Container์ ์ ์ฅ > ์ฑ ์ญ์ ์ ๊ฐ์ด ์ญ์ ๋๋ค.
โญ๏ธ UserDefault ์ฌ์ฉํ๊ธฐ - Swift
1. set
let userName = "์ฌ๋"
UserDefaults.standard.set(userName, forKey: "name")
2. get
UserDefaults.standard.string(forKey: "name")
3. remove
UserDefaults.standard.removeObject(forKey: "name")
4. ์ ์ฒด UserDefault ๊ฐ์ฒด ๋ชฉ๋ก ์กฐํ
for (key, value) in UserDefaults.standard.dictionaryRepresentation() {
print("\(key) = \(value) \n")
}
โญ๏ธ UserDefault ์ฌ์ฉํ๊ธฐ - Objective-C
1. set
[[NSUserDefaults standardUserDefaults] setObject:false forKey:@"TEST_INVALID"]
2. get
[[NSUserDefaults standardUserDefaults] objectForKey:@"TEST_INVALID"]
โญ๏ธ UserDefault ์ ์ ์ฅ ๋์๋์ง ํ์ธํ๊ธฐ - plist ํ์ผ ํ์ธ
Data container ์์ Library > Preferences ๋ด plist ํ์ผ์์ ํ์ธ ๊ฐ๋ฅ
ํด๋น ๊ฒฝ๋ก ํ์ธํ๋ ๋ฒ : NSHomeDirectory ์ฌ์ฉ
//UserDefaults ๋ฐ์ดํฐ ์ ์ฅ
UserDefaults.standard.setValue(true, forKey: "test")
//์ ์ฅ ๊ฒฝ๋ก ์ถ๋ ฅ
print("App Directory path : \(NSHomeDirectory())")
[์ถ๋ ฅ๊ฐ]
์ถ๋ ฅ๋ ๊ฒฝ๋ก์์ Library > Preferences > ์ฑ๋ฒ๋คID.plist ํ์ผ ํ์ธ
plist ํ์ผ์ ์ด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ์ฅ์ด ์ ๋์ด ์๋ค!
โญ๏ธ UserDefault์ struct ์ ์ฅํ๊ธฐ
“Attempt to insert non-property list object” ์ค๋ฅ ํด๊ฒฐํ๊ธฐ
์๋ ๋ธ๋ก๊ทธ ์ฐธ๊ณ ๋ฅผ ๋ง์ด ํ๋ค.
https://ios-development.tistory.com/702
์์ฝ ์ ๋ฆฌํ์๋ฉด,
Swift๋ ๋ฉ๋ชจ๋ฆฌ ํน์ ๋์คํฌ์ ๊ฐ์ฒด ์ ๋ณด๋ฅผ ์ ์ฅํ ๋, byteBuffer๋ฅผ ์ฌ์ฉํด์ ์ ์ฅ
> ์ ์ฅํ ๋, ์์นด์ด๋น์ ํตํด ๋ฐ์ดํธ ํํ๋ก ๋ณ๊ฒฝํ๋ ์์ ์ด ํ์
> ๊ธฐ๋ณธํ์ ์ธ Int, Double, String์ Userdefault์ ์ ์ฅํ ๋ ๋ด๋ถ์ ์ผ๋ก ์์ ์ด ์งํ
> ํ์ง๋ง, Struct์ ๊ฒฝ์ฐ ์ง์ ์์นด์ด๋น ์์ ์ ์ํํด ์ค์ผํจ!!!!!
> ๋ฐ๋ผ์ ์ ์๋ฌ๋ ์์นด์ด๋นํด์ฃผ์ง ์์ ๋ฐ์ํ๋ ์๋ฌ~~~~
์๋๋ Solution!
๋จผ์ , Struct์ Codable ํ๋กํ ์ฝ ์ค์ํด์ผ ํจ
struct SubjectModel: Codable {
let code: Int
let value: String
let topic: String
}
propertyWrapper๋ฅผ ์ด์ฉํ์ฌ ์์นด์ด๋น, ์ธ์์นด์ด๋น ๋ด๋ถ์ ์ผ๋ก ๊ตฌํํด์ค๋ค.
struct UserDefaultsManager {
@UserDefaultWrapper(key: "subjectList", defaultValue: nil)
static var subjectList: [SubjectModel]?
}
//UserDefaultWrapper ์ ์
@propertyWrapper
struct UserDefaultWrapper<T: Codable> {
private let key: String
private let defaultValue: T?
init(key: String, defaultValue: T?) {
self.key = key
self.defaultValue = defaultValue
}
var wrappedValue: T? {
get {
// ์ธ์์นด์ด๋น ์ ์ : JSONDecoder ์ฌ์ฉ
if let savedData = UserDefaults.standard.object(forKey: key) as? Data {
let decoder = JSONDecoder()
if let lodedObejct = try? decoder.decode(T.self, from: savedData) {
return lodedObejct
}
}
return defaultValue
}
set {
// ์์นด์ด๋น ์ ์ : JSONEncoder ์ฌ์ฉ
let encoder = JSONEncoder()
if let encoded = try? encoder.encode(newValue) {
UserDefaults.standard.setValue(encoded, forKey: key)
}
}
}
}
์ ์ฅํ๊ณ ๋ณผ๋ฌ์ฌ ๋๋ ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ค.
let dataString = String(data: response.data!, encoding: .utf8)
let data = dataString!.data(using: .utf8)!
if let jsonArray = try JSONSerialization.jsonObject(with: data, options : .allowFragments) as? [Dictionary<String,Any>]{
UserDefaultsManager.subjectList = []
for subject in jsonArray{
let subjectData = SubjectModel(code: subject["code"] as! Int,
value: subject["value"] as! String,
topic: subject["topic"] as! String)
//์ ์ฅํ๊ธฐ
UserDefaultsManager.subjectList!.insert(subjectData, at: 0)
}
}
//๋ถ๋ฌ์ค๊ธฐ
print(UserDefaultsManager.subjectList)