iOS
iOS) UserDefaults 에 image 저장하기
hyun99999
2021. 9. 6. 13:11
728x90
반응형
내용
- User Defaults 는 NSData, NSString, NSNumber, NSDate, NSArray, NSDictionary 의 인스턴스여야 한다. 만약에 이미지 데이터를 저장하기 위해서는 Data 로 변환을 해주어야 한다.
자, UIImage 를 Data 로 변환해보자.
(Data 는 구조체이고 NSData 는 Data 와 연결되는 클래스다. 그래서 개발자문서에서는 인스턴스의 조건에 NSData 를 쓴것이고 구글링하면 대부분의 문서에서는 Data 로 변환해야한다고 편하게 말하는 듯 하다.)
참고 :
iOS) User Defaults vs Core Data
📌 UIImage 저장하기
// ✅ UIImage convert to NSData
func setUserDefaults(UIImage value: UIImage, _ key: String) {
// ✅ compressionQuality : 압축 퀄리티. 0.0(최대 압축, 최저 화질) ~ 1.0(최저 압축, 최고 화질)
let imageData = value.jpegData(compressionQuality: 1.0)
// ✅ 아래처럼 사용할 수 있다.
// let imageData = UIImage.jpegData(value)
// ✅ UserDefatuls 에 Data 로 저장.
UserDefaults.standard.set(imageData, forKey: key)
}
// ✅ 사용
// setUserDefaults(UIImage: profileImage, "SavedImage")
- UIImage.jpegData 로 사용해도 된다. 사용법의 차이다. 다음에서 볼 수 있듯이 같이 동일한 메서드다.

❓ pngData VS jpegData
메서드를 사용하다보니 UIImage 를 Data 로 변환하는데 두개의 함수가 존재했다.

- PNG 저장
- JPEG 저장
- pngData VS jpegData
용량면에서 PNG 보다 JPEG 가 더 크기가 작다. 더 자세한 내용은 짱짱 zedd 님을 참고해보자.
iOS ) pngData VS jpegData(compressionQuality:)
📌 UIImage 불러오기
if let imageData = UserDefaults.standard.data(forKey: "SavedImage"),
let image = UIImage(data: imageData) {
testImageView.image = image
}
❌ 문제 발생
이미지를 데이터로 변환해서 잘 저장했지만 불러올 때 nil 을 불러왔다. 그리고 다음같이 콘솔에 찍혔다.

용량 문제같았다.(테스트해보기 위해서 고화질 사진을 다른 key 으로 몇개 넣었었다;)
해결
- 용량이 적은 저화질의 사진을 넣었고 성공적으로 가져올 수 있었다. UserDefaults 가 가지는 용량을 초과한 듯 하다.
- clean build 를 해도 성공적으로 가져올 수 있었다. 이 역시 누적된 고화질 사진들의 영향이다.
UserDefaults 용량?
UserDefaults 에도 용량이 존재한다. 무심코 썼는데 대용량 데이터를 쓰지말라는 말이 이건가 싶었다.
다음의 개발자문서에서는 tvOS 에 대해서는 1MB 까지 제공한다고 한다.
728x90
반응형