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