[iOS 7주차] CoreData에 image 저장하기

황석범·2024년 12월 10일
0

내일배움캠프_iOS_5기

목록 보기
43/76

Core Data에 이미지를 저장하는 방법은 두 가지가 있다.

1. 이미지를 Binary Data 타입으로 저장

2. 이미지 파일을 로컬 디렉토리에 저장하고 Core Data에 파일 경로를 저장


1. Binary Data로 저장

  • Core Data의 Binary Data 속성을 사용하여 이미지를 직접 저장할 수 있습니다. 이 방식은 간단하지만, 데이터베이스 크기가 커질 수 있으므로 관리에 주의해야 합니다.
import CoreData
import UIKit

// 이미지를 Core Data에 저장
func saveImageToCoreData(image: UIImage) {
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
    let context = appDelegate.persistentContainer.viewContext

    // 새로운 엔티티 생성
    let entity = NSEntityDescription.entity(forEntityName: "ImageEntity", in: context)!
    let newImage = NSManagedObject(entity: entity, insertInto: context)

    // UIImage를 Data로 변환
    if let imageData = image.jpegData(compressionQuality: 1.0) {
        newImage.setValue(imageData, forKey: "imageData")
    }

    // 저장
    do {
        try context.save()
        print("Image saved successfully")
    } catch {
        print("Failed to save image: \(error)")
    }
}

// Core Data에서 이미지 로드
func fetchImageFromCoreData() -> UIImage? {
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return nil }
    let context = appDelegate.persistentContainer.viewContext

    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "ImageEntity")

    do {
        let results = try context.fetch(fetchRequest)
        if let imageData = results.first?.value(forKey: "imageData") as? Data {
            return UIImage(data: imageData)
        }
    } catch {
        print("Failed to fetch image: \(error)")
    }
    return nil
}

2. 로컬 디렉토리에 저장하고 경로 관리

-이미지 데이터를 파일로 저장한 뒤, Core Data에는 파일 경로만 저장하는 방식입니다. 이 방식은 데이터베이스 크기를 효율적으로 관리할 수 있습니다.

// 이미지를 로컬 디렉토리에 저장
func saveImageToDocuments(image: UIImage, fileName: String) -> String? {
    if let data = image.jpegData(compressionQuality: 1.0) {
        let filePath = getDocumentsDirectory().appendingPathComponent(fileName)
        do {
            try data.write(to: filePath)
            return filePath.path
        } catch {
            print("Failed to save image to documents: \(error)")
        }
    }
    return nil
}

// Core Data에 경로 저장
func saveImagePathToCoreData(filePath: String) {
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
    let context = appDelegate.persistentContainer.viewContext

    let entity = NSEntityDescription.entity(forEntityName: "ImageEntity", in: context)!
    let newImage = NSManagedObject(entity: entity, insertInto: context)

    newImage.setValue(filePath, forKey: "imagePath")

    do {
        try context.save()
        print("Image path saved successfully")
    } catch {
        print("Failed to save image path: \(error)")
    }
}

// 로컬 디렉토리에서 이미지 로드
func fetchImageFromDocuments(fileName: String) -> UIImage? {
    let filePath = getDocumentsDirectory().appendingPathComponent(fileName).path
    if FileManager.default.fileExists(atPath: filePath) {
        return UIImage(contentsOfFile: filePath)
    }
    return nil
}

// Documents 디렉토리 경로 가져오기
func getDocumentsDirectory() -> URL {
    return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
}

어떤 방식을 사용해야할까

  • Binary Data 방식: 데이터베이스의 크기가 커지더라도 별로 신경 쓰이지 않는 소규모 앱에서 사용.
  • 파일 경로 방식: 이미지 데이터가 많아질 가능성이 있거나 대용량 이미지를 저장하는 경우 적합.

1. UIImage를 Data로 변환해서 저장하기

-Core Data에 저장할 때 UIImage를 Data로 변환합니다.

newPhoneBook.setValue(image.pngData(), forKey: PokemonPhoneBook.Key.image)

2. Data를 UIImage로 변환하기

-Core Data에서 데이터를 가져와 사용할 때 Data를 UIImage로 변환합니다.

if let imageData = newPhoneBook.value(forKey: PokemonPhoneBook.Key.image) as? Data {
    let image = UIImage(data: imageData)
}

주의점

  1. 이미지 크기: 이미지가 너무 클 경우 Core Data 저장 시 성능 문제가 생길 수 있습니다. 이 경우, 이미지를 저장하기 전에 크기를 줄이거나 압축하는 것이 좋습니다.
  2. Binary Data 최적화: Xcode에서 “Allows External Storage” 옵션을 활성화하면 큰 Binary Data는 외부 스토리지에 저장되고 Core Data에 대한 성능 영향을 줄일 수 있습니다.
profile
iOS 공부중...

0개의 댓글

관련 채용 정보