我的CoreData中有一些电影,书籍和连续剧实体。对于文档目录中存储的实体中的每个对象,我也都有图像。删除对象时,我必须删除一个图像(我仅将CoreData中的url存储到我的图像中)
我想使“对象列表视图”通用,因此我将其设为“通用”。我现在有问题。我有函数在List的每个元素上调用方法.onDelete
。在这种方法中,我将删除使用imageName参数调用的图像。而且有一个问题。我有一个错误,是说T
对象没有.id
属性。
在C ++中,有一个规则,即每个类都应为每个自我清理。所以我认为我可以使用解构来解决它。在'deinit'中,我要写的是,如果对象具有图像,则应将其删除。
哪里有问题?我不知道是否可以制作这样的deinit
,因为我没有实体类。 CoreData制作了它们。
这是我的通用代码,也许还有另一种解决方法
import SwiftUI
import CoreData
struct FilteredList<T: NSManagedObject, Content: View>: View {
@Environment(\.managedObjectContext) var moc
var fetchRequest: FetchRequest<T>
var objects: FetchedResults<T> { fetchRequest.wrappedValue }
var wasSeen: Bool
let content: (T) -> Content
init(filter: Bool, @ViewBuilder content: @escaping (T) -> Content) {
let predicate = NSPredicate(format: "seen == %@", NSNumber(value: filter))
fetchRequest = FetchRequest<T>(entity: T.entity(), sortDescriptors: [], predicate: predicate)
self.wasSeen = filter
self.content = content
}
var body: some View {
List() {
ForEach(objects, id: \.self) { object in
self.content(object)
/*NavigationLink(destination: DetailSeriesView(series: serie)) {
HStack {
EmojiRatingView(rating: serie.rating)
.font(.largeTitle)
VStack(alignment: .leading) {
Text(serie.title ?? "Unknown Title")
.font(.headline)
Text(serie.producent ?? "Unknown Producent")
.foregroundColor(.secondary)
}
Spacer()
Text("\(self.howMuchTime(serie: serie))h")
.foregroundColor(.secondary)
}
}*/
}
.onDelete(perform: deleteSeries) //Is there another way to use .onDelete? Maybe somewhere not in Generic file?
}
}
func deleteSeries(at offsets: IndexSet) {
for offset in offsets {
let object = objects[offset]
if object.isCustomImage == true {
ImageToDirectory().deleteItemInDirectory(imageName: object.id.uuidString) //THERE IS A PROBLEM
}
moc.delete(object)
}
try? moc.save()
}
}
答案 0 :(得分:1)
从内存中删除对象时,将调用诸如deinit
之类的方法,这与从持久性存储中删除对象不一定相同,因此我认为这不是前进的方向。
相反,我认为您应该研究NSManagedObject中的替代didSave(),该对象在保存或删除对象时会被调用,并从那里删除任何图像。您可以在扩展程序中覆盖该方法,但是由于您对核心数据类感到困惑,因此建议您阅读有关generating code的核心数据实体的信息。