Core 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
}
-이미지 데이터를 파일로 저장한 뒤, 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]
}
어떤 방식을 사용해야할까
-Core Data에 저장할 때 UIImage를 Data로 변환합니다.
newPhoneBook.setValue(image.pngData(), forKey: PokemonPhoneBook.Key.image)
-Core Data에서 데이터를 가져와 사용할 때 Data를 UIImage로 변환합니다.
if let imageData = newPhoneBook.value(forKey: PokemonPhoneBook.Key.image) as? Data {
let image = UIImage(data: imageData)
}
주의점