UserDefaults에 개체 저장

7061 단어 xcodeswiftiosiphone
UserDefaults는 엄청난 양의 데이터나 복잡한 개체를 보유하기 위한 것이 아닙니다. 이를 위해 CoreData를 사용합니다.
하지만 이봐, 가끔 우리는 게으르다.



최근에 내 트위터 친구가 UserDefaults에 개체를 저장하는 방법을 물었고 그는 이 확장 기능을 좋아하는 것 같아서 멋진 여러분 모두와 공유할 수 있다고 생각했습니다!

스토어에도 앱이 있다는 사실을 알고 계셨나요? 확인해보세요 -> RunRooster

자, 자만하지 말고 바로 시작합시다. 뒤에서 조용히! 🤫

준비 🧩



먼저 저장할 개체를 만듭니다. 앱에서 사용할 수 있는 간단한 개체입니다.

struct UserSettings: Codable {
    var userID: Int?
    var modePreference: String?
    var volumeLevel: Int?
    var highScore: Int?

    enum CodingKeys: String, CodingKey {
        case userID = "id"
        case modePreference = "mode_preference"
        case volumeLevel = "volume_level"
        case highScore = "highscore"
    }
}


서버에서도 해당 정보를 얻을 경우를 대비하여 해당 CodingKeys를 보너스로 추가했습니다. 그리고 snake_case는 작년에 soooo입니다. 엄마 맞죠?

이제 우리는 일부 사용자를 유지할 수 있는 멋진 UserSettings를 얻었습니다....설정? 🥁

이것은 사용자가 일부 정보를 변경했지만 Wi-Fi 또는 다른 유형의 인터넷 연결이 없는 경우에 매우 유용하므로 이 개체를 보관하고 나중에 보낼 수 있습니다.


다음으로 이것은 의무 사항이 아니며 모든 키를 보유하는 별도의 개체를 만듭니다. 키에 손으로 입력한 문자열을 한 번 사용하는 실수를 저질렀습니다... 그리고 다시는 사용하지 않습니다. (악몽 같은 것)

struct Keys {
    static let userSettings = "userSettings"
}



처형 🤯🔫



절약



여기에 흥미로운 부분이 있습니다. 해당 개체를 UserDefaults에 저장할 확장을 만들어 보겠습니다.

extension UserDefaults {

static func saveUserSettings(_ settings: UserSettings) {
    do {
        let encodedUserSettings = try JSONEncoder().encode(settings)
        UserDefaults.standard.set(encodedUserSettings, forKey: Keys.userSettings)
        UserDefaults.standard.synchronize() // this line is a joke btw, read the summary, so awesome :) 
    } catch {
        print("Error saving User Settings.")
    }
}

//... loading code goes here

}


그게 다야!
아주 쉽죠? 이제 일부 개발자(나 자신 포함)가 나중에 사용할 수 있도록 작은 개체를 저장하는 이 빠르고 지저분한 방법을 정말 좋아하는 이유를 알 것입니다.

로드 중



위와 같지만 반대로 ⏪

//... saving code

static func loadUserSettings() -> UserSettings? {
    guard let settings = UserDefaults.standard.object(forKey: Keys.userSettings),
          let loadedSettings = settings as? Data else {
        return nil
    }
    return try? JSONDecoder().decode(UserSettings.self, from: loadedSettings)
}


유일한 차이점은 여기에서 반환이 선택 사항이라는 것입니다. 아직 아무것도 저장하지 않았을 수도 있습니다. 🤷‍♂️



게으름에 대한 모든 농담은 차치하고 UserDefaults 크기는 앱 로딩 시간에 영향을 미치며 더 작은 객체에만 사용해야 한다는 점을 명심하십시오. 또한 사용자 비밀번호를 저장하면 거대한 NO-NO가 있습니다.

미래의 코딩 노력에 도움이 되기를 바랍니다!


읽어주셔서 감사합니다, 당신은 사랑스러운 사람입니다! ♥️ [Twitter][twitter]에 접속해볼까요?

좋은 웹페이지 즐겨찾기