티스토리 뷰

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

Apple Developer Documentation

📌 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 저장

pngData(_:)

  • JPEG 저장

jpegData(_:)

  • 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 까지 제공한다고 한다.

Apple Developer Documentation

728x90
반응형
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
링크
Total
Today
Yesterday