decodeObject
는 기본값을 넣어주지 않으므로 흐름에 따라서 nil을 리턴할건지 지정된 기본값을 넣어줄건지 정해서 그대로 하면 됨. enum Packages: String {
case glass = "glass"
case can = "can"
case plastic = "plastic"
}
required init?(coder: NSCoder) {
let decodedString = coder.decodeObject(forKey: packageString) as? String
let package = Packages(rawValue: decodedString ?? "" )
self.package = package ?? Packages.glass
super.init(coder: coder)
}
override func encode(with coder: NSCoder) {
super.encode(with: coder)
coder.encode(self.package.rawValue, forKey: packageString)
}
데이터를 불러오는 시점은 앱이 시작할 때로
처음에는 화면이 active됐을 때도 데이터를 로드해오면 좋을 것 같아 DidBecomeActive에서 로드를 해줬으나, 화면이 active됐을 때 앱델리게이트의 DidBecomeActive는 호출되지 않았고 씬델리게이트의 DidBecomeActive가 호출됐음.. 화면이 Active 됐는데 앱델리게이트의 이것이 호출되지 않을거면 왜 메서드가 존재하는지 잘 모르겠다.
암튼 런칭 시점에 이미 데이터를 로드해왔으므로 Active되는 시점에 데이터를 불러오지 않아도 될 것 같아서 런칭시점에만 로드되도록 변경함
데이터를 저장하는 시점은 앱이 (예상치 못하게)종료될 때와 백그라운드로 들어갈때
앱 종료시점
앱 스위처에서 앱을 종료했을 때는 willTerminate 가 잘 호출되었음.
허나 앱이 메모리가 부족해지면 suspend 상태인 앱을 별도의 알림 없이 종료시키는데 이때는 willTerminate가 호출되지 않으므로 foreground에서 background로 넘어갈때도 데이터를 저장해주면 좋을 것 같다.
foreground에서 background로 가는 시점
앱델리게이트의 ResignActive는 불려지지 않았고 씬델리게이트의 ResignActive가 불려졌고 앱델리게이트의 didEnterBackground가 불려졌다.
앱델리게이트의 ResignActive가 아닌 didEnterBackground에서 데이터를 저장해주면 될 것 같음
와 iOS-squad는 뭐죠 ㅋㅋㅋ 멋있다...
주말도 화이팅입니다!!