ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

     

    [Swift]NSUserDefaults ๊ฐ’ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ

    NSUserDefaults ๊ฐ’ ๋ชจ๋‘ ์ดˆ๊ธฐํ™” ํ•˜๊ธฐ ๊ฐ„ํ˜น ํ…Œ์ŠคํŠธ ๋ฐ ์ดˆ๊ธฐ ๊ฐ’ ์ƒํƒœ์—์„œ ์ž‘์—…ํ•  ์‹œ NSUserdefault ๊ฐ’์„ ๋‹ค ๋‚ ๋ ค์•ผํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” Code Snippet ์ž…๋‹ˆ๋‹ค. for key in NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys { NSUserDefaults.standardUserDefaults().removeObjectForKey(key.de

    minsone.github.io

     

    ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ UserDefaults๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋‚ด์šฉ์„ ์กฐํšŒํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. 

     

    ์ด ์™ธ์—๋„ initWithSuite, addSuite๋ฅผ ์ด์šฉํ•ด์„œ ์ €์žฅ์†Œ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ ํ•ฉ์น  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ณ ,

    setVolatileDomain๋ฅผ ์ด์šฉํ•ด ์•ฑ์ด ์ผœ์ ธ ์žˆ๋Š” ๋™์•ˆ์—๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ๋„ ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ, ์•„์ง ์ œ๊ฐ€ ํŒŒ์•…์ด ๋‹ค ๋๋‚˜์ง€ ์•Š์•„์„œ... ์ด๊ฑด ์ข€ ๋” ๊ณต๋ถ€ํ•˜๊ณ  ์ •๋ฆฌํ•ด๋ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.

     

    ์ด๋งŒ ์ •๋ฆฌํ•˜๊ณ , ๋‹ค์Œ์— ๋ต™๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋„ ์ฆ๊ฑฐ์šด ํ•˜๋ฃจ ๋˜์‹œ๊ธธ :)

    ๋Œ“๊ธ€

Designed by Tistory. @Bola Kim