[iOS/Swift] Realm - 이미지 파일 저장하기

2023. 9. 16. 23:20·iOS/UIKit&SwiftUI

 

서버 통신 한 이미지 파일 저장하고 불러오기

Untitled.pngUntitled.png

서버 통신을 통해 받은 이미지 url을 데이터 베이스에 저장한 후 꺼내와서 이미지를 로드하면 오류가 발생한다.

데이터 베이스 내부에서 꺼내온 값을 글로벌로 접근하려고 하기 때문에 발생한 오류이다.

 

Untitled.png

DispatchQueue 외부에서 상수로 저장한 후 사용하면 오류가 나지 않는다.

이미지를 하나하나 불러올 때 마다 네트워크 통신을 하게 되는데, 이미지의 용량이 크거나 로드할 데이터가 많다면 이미지 로드가 오래 걸릴 수 있다.

 

❓ 어떻게 해결해야 할까?

이미지 구현을 셀 구성할 때 하지말고, 미리 UIImage 형식으로 변환 후 셀에 보여주는 것.

하지만 이 또한 데이터가 여러개라면 변환하는 데에 오랜 시간이 걸리고,

사용자가 보지 않고 넘겨버릴 이미지까지 모두 로드를 해야하기 때문에 비효율적이다.

 

prepareForReuse() 사용하기 → 재사용 시 nil로 초기화

이미 로드한 이미지도 지나갔다가 돌아가면 또 다시 불러와야 하는 문제가 있다.

➡️ 이미지 url을 저장하는 것 보다는 이미지 자체를 저장하여 사용하는 것이 좋다.

  1. jpg 파일을 document에 저장하기
  2. Data타입으로 변환하여 default.realm의 column으로 저장하기

 

💡 이미지 파일을 document에 저장하기

넷플릭스 오프라인 저장과 같은 기능이다.

  1. 컬럼 만들어서 이미지 파일 저장하기 → 가장 직관적
  2. pk 이용하여 이미지 파일 명 지정하여 저장

 

  1. 도큐먼트 경로 찾기
guard let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }

document 폴더까지의 경로를 찾기

 

  1. 저장할 경로 설정(세부 경로, 이미지를 저장할 위치)
let fileURL = documentDirectory.appendingPathComponent(fileName) 

총 url을 찾아준다.

appendingPathComponent → ‘ / ‘ 슬래시 역할

 

  1. 이미지 변환

Untitled.pngUntitled.png

guard let data = image.jpegData(compressionQuality: 0.5) else { return } 

compressionQuality로 압축 가능

 

  1. 이미지 저장

이미지 저장 시 사용자 기기 저장공간을 체크한 후 저장해야 한다.

백업복구,,

do {
    try data.write(to: fileURL)
} catch let error {
    print("file save error", error)
    // 사용자에게 보여줄 액션을 구현해야 한다.
}

 

💻 전체 코드

import UIKit

extension UIViewController {
    //document 폴더에 이미지를 저장하는 메서드
    func saveImageToDocument(fileName: String, image: UIImage) {
        // 1. 도큐먼트 경로 찾기
        guard let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
        
        // 2. 저장할 경로 설정(세부 경로, 이미지를 저장할 위치)
        let fileURL = documentDirectory.appendingPathComponent(fileName)
        
        // 3. 이미지 변환
        guard let data = image.jpegData(compressionQuality: 0.5) else { return }
        
        // 4. 이미지 저장
        do {
            try data.write(to: fileURL)
        } catch let error {
            print("file save error", error)
            // 사용자에게 보여줄 액션을 구현해야 한다.
        }
    }
}

Untitled.pngUntitled.png

document파일에 이미지 파일이 저장된다.

사진을 여러장 저장할 때 파일명 설정이나 순서 등 문제 발생 요소가 많다.

 

💡 저장된 이미지 불러오기

  1. 도큐먼트 경로 찾기
guard let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return UIImage(systemName: "photo")! }
  1. 경로 설정(세부 경로, 이미지가 저장되어 있는 위치)
let fileURL = documentDirectory.appendingPathComponent(fileName) 
  1. 해당 파일에 해당 파일 이름이 존재하는지 판단 후 UIImage return
if FileManager.default.fileExists(atPath: fileURL.path) {
    return UIImage(contentsOfFile: fileURL.path)!
} else {
    return UIImage(systemName: "photo")!
}

 

Untitled.png

viewcontroller에서는 이미지 관련 통신 없이 이미지를 보여줄 수 있다.

 

해상도 때문에 작게 보여주거나 이미지를 크게 보여줘야 하는 경우 파일 용량을 나눠 두 개의 파일을 저장하기도 한다.

 

이미지 폴더 만들어서 백업 복구할 때 폴더 자체로 할 수 있다.

 

보안이 중요한 데이터를 다뤄야 한다면

→ realm 폴더에 암호화 가능

→ library 폴더 내에 저장하는 것도 좋음(접근이 어렵기 때문)

library폴더에 저장하려면 let realm = try! Realm() 구문으로 접근할 수 없다.

 

💡 이미지 파일 삭제하기

Untitled.png

 

 

❗️ 주의

Untitled.png

\

 

Untitled.png

 

realm에 데이터가 삭제되면 data 상수 값까지 삭제가 되어 이미지 파일을 삭제하려고 할 때 접근을 하지 못한다.

⇒ 코드의 순서가 바뀌어야 한다.

 

 

Untitled.png

레코드를 날리기 전에 이미지 파일 삭제 후 레코드 삭제해야 한다.

'iOS > UIKit&SwiftUI' 카테고리의 다른 글

[iOS/Swift] MapKit - 위치 권한 설정을 구현해보자!  (0) 2023.10.01
[iOS/Swift] Realm - 백업 및 복구 구현하기  (1) 2023.09.16
[iOS/Swift] Realm - Migration  (0) 2023.09.16
[iOS/Swift] Realm - CRUD  (1) 2023.09.16
iOS 13 이후의 앱의 라이프 사이클 & available  (0) 2023.07.30
'iOS/UIKit&SwiftUI' 카테고리의 다른 글
  • [iOS/Swift] Realm - 백업 및 복구 구현하기
  • [iOS/Swift] Realm - Migration
  • [iOS/Swift] Realm - CRUD
  • iOS 13 이후의 앱의 라이프 사이클 & available
김졀니
김졀니
🍎 iOS 개발
  • 김졀니
    졀니의 개발 공부✨
    김졀니
  • 전체
    오늘
    어제
    • 분류 전체보기
      • iOS
        • Swift
        • UIKit&SwiftUI
        • RxSwift&Combine
        • WWDC
      • Study
        • 🚨 TroubleShooting
        • 🌱 SeSAC
  • 블로그 메뉴

    • 홈
    • Github
  • 인기 글

  • 최근 글

  • 태그

    OperationQueue
    이미지 캐싱
    layoutIfNeeded
    kingfisher header
    인앱리뷰
    Sendable
    clipstobounds
    mainactor
    ios
    observable
    @PropertyWrapper
    swiftdata
    CLLocation
    FileManager
    wwdc23
    Drawing Cycle
    RxSwift
    mapkit
    swift concurrency
    위치 권한
    traits
    actor
    의존성 주입
    동시성프로그래밍
    Swift
    pointfree
    concurrency
    ReactorKit
    displayPriority
    Realm
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
김졀니
[iOS/Swift] Realm - 이미지 파일 저장하기
상단으로

티스토리툴바