在CoreData中初始化,通用类型

时间:2020-01-02 19:24:50

标签: swift generics swiftui

我的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()
}


}

1 个答案:

答案 0 :(得分:1)

从内存中删除对象时,将调用诸如deinit之类的方法,这与从持久性存储中删除对象不一定相同,因此我认为这不是前进的方向。

相反,我认为您应该研究NSManagedObject中的替代didSave(),该对象在保存或删除对象时会被调用,并从那里删除任何图像。您可以在扩展程序中覆盖该方法,但是由于您对核心数据类感到困惑,因此建议您阅读有关generating code的核心数据实体的信息。