-
NSUserDefaults(UserDefaults)๋ก ๊ฐ๋จํ๊ฒ ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ๊ณต๋ถ/iOS 2020. 1. 22. 22:56
์๋ ํ์ธ์, ๋ ๋ชฌํด ์ ๋๋ค ๐ ์์ UserDefaults์ ์จ๋ฆํ ์ผ์ด ์๊ธด ๊น์, ์๋ ๋๋ก ์ ๋ฆฌํด๋ณด๊ณ ์์ต๋๋ค.
๋ชฉ์ฐจ
1. NSUserDefaults?
2. ์ด๋ค ๋ ์ฌ์ฉํ ๊น?
3. ํน์ง
4. ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ๊ธฐ
5. ์ปค์คํ ํด๋์ค ๊ฐ์ฒด ์ ์ฅํ๊ณ ๊บผ๋ด์ค๊ธฐ
6. UserDefaults๋ฅผ ๋์ ๋๋ฆฌ ํํ๋ก ๋ณด๊ธฐ
NSUserDefaults?
https://developer.apple.com/documentation/foundation/userdefaults
์ ํ์์ ์ ๊ณตํด์ฃผ๋ ๊ฐ๋จํ String Key-Value ํํ์ ์ ์ฅ์์ ๋๋ค. ๋ด๋ถ์ ์ผ๋ก DB๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํฉ๋๋ค. (์ด๋ค DB์ธ์ง๋ ๋ชป ์ฐพ์๋ค์... )์ฌ๊ธฐ์ ์ ์ฅ๋๋ ๊ฐ๋ค์ Preferences ๋ผ๊ณ ๋ ๋ถ๋ฅด๊ธฐ๋ ํฉ๋๋ค.
์ด๋จ ๋ ์ฌ์ฉํ ๊น?
- ์ฑ์ด ๊บผ์ ธ๋ ํน์ ํ ๊ฐ์ด ์ ์ฅ๋๊ธธ ์ํ๋ ๊ฒฝ์ฐ (์ฒซ ๋ฒ์จฐ ์ฑ ๋ฐ์นญ ์ฌ๋ถ ๋ฑ)
- ์ฌ์ฉ์ ์ค์ (๋ก์ปฌ ์๋ฆผ ์ค์ ์ฌ๋ถ)
- ์ฑ์ด ๊บผ์ ธ๋ ํน์ ํ ๊ฐ์ด ์ ์ฅ๋์ง๋ง, ์ฑ์ด ์ญ์ ๋๋ฉด ๊ฐ์ด ์ฌ๋ผ์ง๊ธธ ์ํ๋ ๊ฒฝ์ฐ
ํน์ง
1. ์ฑ์ด ๊บผ์ ธ๋ ๋ฐ์ดํฐ๋ค์ด ์ ์ง๋๋ฉฐ, ์ฑ์ด ์ญ์ ๋ ์ ๋ฐ์ดํฐ๋ค์ ํจ๊ป ์ฌ๋ผ์ง๋๋ค.
๋ง์ผ ์ฑ์ด ์ญ์ ๋์ด๋ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋๊ธธ ์ํ์ ๋ค๋ฉด Core Data ํน์ KeyChain, NSKeyedArchiever๋ฑ์ ์ด์ฉํ ํ์ผ ํํ๋ก ์ ์ฅํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
(Volatile Domain์ ์ฌ์ฉํ๋ฉด ์ฑ์ด ๊บผ์ง ๋ ์๋์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๊ฒ๋ ํ ์ ์์ต๋๋ค)
2. String Key-Value ํํ์ ์ ์ฅ์์ด๋ฉฐ, ์ ์ฅํ ์ ์๋ ๊ฐ์ Int, Double, Float, String, Bool, Data์, ์ด๋ก ์ด๋ฃจ์ด์ง Array, Dictionary๋ง ๊ฐ๋ฅํฉ๋๋ค.
ํค๋ก๋ String๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ , ์ ์ฅํ ์ ์๋ ๊ฐ์ Int, Double, Float, String, Bool, Data์, ์ด๋ก ์ด๋ฃจ์ด์ง Array, Dictionary๋ง ๊ฐ๋ฅํฉ๋๋ค.
์ํ๊น๊ฒ๋ ์ปค์คํ ํด๋์ค๋ฅผ ๋ฐ๋ก ์ ์ฅํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์ผ๋ฉฐ, NSKeyedArchiever ๋ฑ์ ์ฌ์ฉํด Data๋ก ์ ํํ ๋ค์ ์ ์ฅํด์ผ ํฉ๋๋ค.
๊ฐ๋จํ๊ฒ ์ฌ์ฉํ๊ธฐ
standard๋ฅผ ์ด์ฉํ ์ ์ฅ / ๊บผ๋ด์ค๊ธฐ
์ฑ์ ๊ณต์ฉ ๊ธฐ๋ณธ NSUserDefaults ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. standard๋ initWithSuite(nil)๊ณผ ๋์ผํฉ๋๋ค.
//ํค๋ก String์ ์ฌ์ฉํฉ๋๋ค. let stringKeyForUserDefault = "stringKey" let immuatablestringKeyForUserDefault = "immutablestringKey" let floatKeyForUserDefault = "floatKey" //์ ์ฅ UserDefaults.standard.set("์กธ๋ ค์ ", forKey: stringKeyForUserDefault) UserDefaults.standard.set(4.5, forKey: floatKeyForUserDefault) UserDefaults.standard.set(NSMutableString(string: "๊ฒฐ๊ตญ ๋์ค๋ ๊ฑด Immutable ~.~"), forKey: immuatablestringKeyForUserDefault) //๊บผ๋ด์ค๊ธฐ print(UserDefaults.standard.string(forKey: stringKeyForUserDefault)) print(UserDefaults.standard.float(forKey: floatKeyForUserDefault)) print(UserDefaults.standard.string(forKey: immuatablestringKeyForUserDefault))
์ปค์คํ ํด๋์ค ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ณ ๊บผ๋ด์ค๊ธฐ
์ํ๊น๊ฒ๋ ์ปค์คํ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ์ ์ฅํ ์๋ ์์ต๋๋ค. ์ ํ์์๋ NSKeyedAchiever๋ฅผ ์ด์ฉํด Data(NSData) ํ์์ผ๋ก ๋ณํํด์ ์ ์ฅํ๋ผ๊ณ ๊ถ์ฅํ๊ณ ์์ต๋๋ค.
1. ์ ์ฅํ ํด๋์ค๋ฅผ NSObject์ ํ์ํด๋์ค๋ก, NSCoding ํ๋กํ ์ฝ์ ์ค์ํ๊ฒ ๋ณ๊ฒฝ
2. NSKeyedArchiever๋ก Data๋ก ๋ณ๊ฒฝ ํ ์ ์ฅ
3. NSkeyedUnArchiever๋ก ์ํ๋ ๊ฐ์ฒด๋ฅผ ๋ณต๊ตฌํด์ค๊ธฐ
1. ์ ์ฅํ ํด๋์ค๋ฅผ NSObject์ ํ์ํด๋์ค๋ก, NSCoding ํ๋กํ ์ฝ์ ์ค์ํ๊ฒ ๋ณ๊ฒฝ
(NSObject๊ฐ ์๋๋ฉด methodForSignature ๋ฉ์๋๋ฅผ ๋ชป ์ฐพ๋๋ค๋ฉฐ ์๋ฌ๋ฅผ ํค ๋ฑ์ต๋๋ค... )
//Person. NSObject์ NSCoding class Person : NSObject ,NSCoding { var name : String var age : Int init(name aName :String, age aAge : Int) { self.name = aName self.age = aAge } //NSCoding Protocol ๊ตฌํ required init?(coder: NSCoder) { self.name = coder.decodeObject(forKey: "name") as! String self.age = coder.decodeInteger(forKey: "age") } func encode(with coder: NSCoder) { coder.encode(self.name, forKey: "name") coder.encode(self.age, forKey: "age") } }
2. NSKeyedAchiever๋ก Data๋ก ๋ณ๊ฒฝ ํ ์ ์ฅ
do { //Data๋ก ํด๋์ค๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. //secureCoding์ true๋ก ํ๋ ค๋ฉด, ํด๋์ค๊ฐ NSSecureCoding์ ๋ฐ๋ผ์ผ ํฉ๋๋ค. let mePropertyListData = try NSKeyedArchiver.archivedData(withRootObject: me, requiringSecureCoding: false) //์ ์ฅํฉ๋๋ค UserDefaults.standard.set(mePropertyListData, forKey: "me") } catch { print(error) }
3. NSkeyedUnArchiever๋ก ์ํ๋ ๊ฐ์ฒด๋ฅผ ๋ณต๊ตฌํด์ค๊ธฐ
NSKeyedUnarchiver๋ก ๋ณตํธํ ํ ์ ์์ต๋๋ค. do - catch ๋ธ๋ญ์ผ๋ก ๊ฐ์ธ์ฃผ์ด์ผ ํฉ๋๋ค.
let achievedData = UserDefaults.standard.object(forKey: objectKey) do { let person = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(achievedData as! Data) as! Person print(person.name) print(person.age) } catch { print(error) }
UserDefaults๋ฅผ Dictionary ํํ๋ก ๊ฐ์ ธ์ค๊ธฐ
dictionaryRepresentation()๋ก UserDefaults๋ฅผ Dictionaryํํ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
let standard = UserDefaults.standard print(standard.dictionaryRepresentation())
์ถ๋ ฅํ๋ฉด ๋ฃ์ ์ ์ด ์๋ ๋ง์ ๊ธฐ๋ณธ ์์๋ค๊ณผ ํจ๊ป, ์์์ ์ ์ฅํ๋ ๊ฐ๋ค์ด ๋ค์ด๊ฐ ์๋ ๋ชจ์ต์ ๋ณผ ์ ์์ต๋๋ค...
๋๋ณด๊ธฐ["AppleITunesStoreItemKinds": <__NSCFArray 0x600001153980>(
eBook,
artist
)
, "objectKey": <62706c69 73743030 d4010203 04050607 0a582476 65727369 6f6e5924 61726368 69766572 5424746f 7058246f 626a6563 74731200 0186a05f 100f4e53 4b657965 64417263 68697665 72d10809 54726f6f 748001a4 0b0c1314 55246e75 6c6cd30d 0e0f1011 12546e61 6d655361 67655624 636c6173 73800210 22800359 4c656d6f 6e204b69 6dd21516 17185a24 636c6173 736e616d 65582463 6c617373 65735f10 1a467261 6d65776f 726b506c 61796772 6f756e64 2e506572 736f6ea2 191a5f10 1a467261 6d65776f 726b506c 61796772 6f756e64 2e506572 736f6e58 4e534f62 6a656374 08111a24 29323749 4c515358 5e656a6e 7577797b 858a959e bbbedb00 00000000 00010100 00000000 00001b00 00000000 00000000 00000000 0000e4>, "PKKeychainVersionKey": 6, "NSInterfaceStyle": macintosh, "AddingEmojiKeybordHandled": 1, "stringKey": ์กธ๋ ค์ , "AppleLanguagesSchemaVersion": 1001, "me": <62706c69 73743030 d4010203 04050607 0a582476 65727369 6f6e5924 61726368 69766572 5424746f 7058246f 626a6563 74731200 0186a05f 100f4e53 4b657965 64417263 68697665 72d10809 54726f6f 748001a4 0b0c1314 55246e75 6c6cd30d 0e0f1011 12546e61 6d655361 67655624 636c6173 73800210 22800359 4c656d6f 6e204b69 6dd21516 17185a24 636c6173 736e616d 65582463 6c617373 65735f10 1a467261 6d65776f 726b506c 61796772 6f756e64 2e506572 736f6ea2 191a5f10 1a467261 6d65776f 726b506c 61796772 6f756e64 2e506572 736f6e58 4e534f62 6a656374 08111a24 29323749 4c515358 5e656a6e 7577797b 858a959e bbbedb00 00000000 00010100 00000000 00001b00 00000000 00000000 00000000 0000e4>, "AKLastIDMSEnvironment": 0, "CarCapabilities": {
CarCapabilitiesDefaultIdentifier = {
CRCapabilitiesDisabledFeatureKey = 0;
CRCapabilitiesUserInterfaceStyleKey = 2;
CRCapabilitiesVersionKey = "";
CapabilitiesDashboardRoundedCornersKey = "{{13, 0}, {0, 0}}";
CapabilitiesNowPlayingAlbumArtKey = 2;
CapabilitiesViewAreaInsetKey = "{{0, 0}, {0, 0}}";
};
}, "AKLastEmailListRequestDateKey": 2020-01-23 09:55:52 +0000, "AppleKeyboards": <__NSCFArray 0x60000277ada0>(
en_US@sw=QWERTY;hw=Automatic,
emoji@sw=Emoji,
ko_KR@sw=Korean;hw=Automatic,
en_US@sw=QWERTY;hw=Automatic
)
, "AppleKeyboardsExpanded": 1, "floatKey": 4.5, "AppleLanguages": <__NSCFArray 0x600001153a40>(
en,
ko-KR
)
, "ApplePasscodeKeyboards": <__NSCFArray 0x60000277ad50>(
en_US@sw=QWERTY;hw=Automatic,
emoji@sw=Emoji,
ko_KR@sw=Korean;hw=Automatic
)
, "immutablestringKey": ๊ฒฐ๊ตญ ๋์ค๋ ๊ฑด Immutable ~.~, "NSLanguages": <__NSArrayI 0x600000442b00>(
en,
ko-KR
)
]
+ ์ด๋ฅผ ์ด์ฉํด์ UserDefaults๋ฅผ ์ด๊ธฐํ ํ๋ ์ค๋ํซ์ด ์๋ค๊ณ ํฉ๋๋ค! ์๋ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ์กฐํด ์ฃผ์ธ์ฉ
http://minsone.github.io/mac/ios/clear-userdefaults-value-in-swift
์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ UserDefaults๋ฅผ ์ฌ์ฉํ๊ณ , ๋ด์ฉ์ ์กฐํํ๋ ๊ฒ๊น์ง ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
์ด ์ธ์๋ initWithSuite, addSuite๋ฅผ ์ด์ฉํด์ ์ ์ฅ์๋ฅผ ๋ถ๋ฆฌํ๊ฑฐ๋ ํฉ์น ์ ์๋ ๋ฐฉ๋ฒ๋ ์๊ณ ,
setVolatileDomain๋ฅผ ์ด์ฉํด ์ฑ์ด ์ผ์ ธ ์๋ ๋์์๋ง ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ๋ ์์ต๋๋ค๋ง, ์์ง ์ ๊ฐ ํ์ ์ด ๋ค ๋๋์ง ์์์... ์ด๊ฑด ์ข ๋ ๊ณต๋ถํ๊ณ ์ ๋ฆฌํด๋ด์ผ๊ฒ ์ต๋๋ค.
์ด๋ง ์ ๋ฆฌํ๊ณ , ๋ค์์ ๋ต๊ฒ ์ต๋๋ค. ์ค๋๋ ์ฆ๊ฑฐ์ด ํ๋ฃจ ๋์๊ธธ :)
'๊ณต๋ถ > iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ