0

以下代码成功将Car实体保存到Core Data. 如您所见,该Car实体具有Binary Data我保存图像以将其用作缩略图的属性。我对下面代码的问题是,如果用户决定不向某些Cars 添加图像,我需要提供默认图像,我能想到的唯一选择是defaultCarImageAssets文件夹中有一个然后调用它并将其保存在用户没有为其选择图像的汽车上。我对这种方法的问题是,如果用户决定不为任何他/她的汽车使用图像,我将在数十或数百辆汽车中保存相同的图像。有没有办法以某种方式重用已经保存的图像Core Data

Car为用户未提供图像的实体提供默认图像的正确方法是什么?

实体

Car

属性

carImage    Binary Data (Allows External Storage)
make        String
model       String

核心数据管理器

import SwiftUI
import CoreData

class CoreDataManager{
    static let instance = CoreDataManager()
    
    let container: NSPersistentContainer
    let context: NSManagedObjectContext
    
    init(){
        container = NSPersistentContainer(name: "CoreDataContainer")
        container.loadPersistentStores { (description, error) in
            if let error = error{
                print("Error loading Core Data. \(error)")
            }
        }
        context = container.viewContext
    }
    
    func save(){
        do{
            try context.save()
            print("Saved successfully!")
        }catch let error{
            print("Error saving Core Data. \(error.localizedDescription)")
        }
    }
}

核心数据模型

import Foundation
import CoreData
import UIKit

class CoreDataViewModel: ObservableObject{
    
    let manager = CoreDataManager.instance
    
    @Published var cars: [Car] = []

    func addCar(make: String, model: String, image:UIImage){
        
        let imageData = image.jpegData(compressionQuality: 0.1)
        
        let car = Car(context: manager.context)
        car.make = make
        car.model = model
        car.carImage = imageData
        save()
        getCars()
    }
}

内容视图

struct ContentView: View {
    @StateObject var coreDataViewModel = CoreDataViewModel()
    @State private var makeInput:String = ""
    @State private var modelInput:String = ""
    @State private var carImageFromPicker: UIImage?

    var body: some View {
        VStack{
            if let inputImage = carImageFromPicker {
                Image(uiImage: inputImage)
                    .resizable()
                    .onTapGesture {
                        // show camera
                    }
            } else {
                Image(systemName: "car.fill")// default image 
                .onTapGesture {
                    // show camera
                }
            }

            Button(action: {
                saveNewCar()
            }) {
                Text("Save")
            }
        }
    }

    func saveNewCar(){
        coreDataViewModel.addCar(make: makeInput, model: modelInput, image: carImageFromPicker!)
    }
}
4

0 回答 0