Swift:Class 内的 CoreData FetchRequest 不工作

Swift: CoreData FetchRequest within Class doesn't work

我正在尝试从通知代理中的核心数据实体中获取 Class,但它无法访问它。

它与另一个视图中的 @Environment 和 @FetchRequest 相同,效果很好,但它似乎无法从此 class.

访问实体

如果这是基本问题或解决方案在其他地方,我很抱歉,但我找不到有效的答案。 谢谢!

class NotificationDelegate: NSObject, ObservableObject, UNUserNotificationCenterDelegate {
    
@Environment(\.managedObjectContext) var context: NSManagedObjectContext

@Published var countdownToSee: EventEntity?

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    completionHandler([.badge, .banner, .sound])
}


@FetchRequest(
    entity: EventEntity.entity(),
    sortDescriptors: []) var upcomingEvents: FetchedResults<EventEntity>

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    
    if response.actionIdentifier == "OPEN" {
        print("Open")
        print(upcomingEvents.count)
        
    }
    
    completionHandler()
}

}

类 在 SwiftUI 中没有视图,我想你不能那样做。考虑在一个视图中获取您需要的信息,然后将它们传递给 class。

struct MyView: View {
    @Environment(\.managedObjectContext) private var viewContext
    
    @FetchRequest(
        entity: EntityClassName.entity(),
        sortDescriptors: [NSSortDescriptor(keyPath: \EntityClassName.name, ascending: false)],
        predicate: NSPredicate(format: "someAttributeName == %@", NSNumber(value: false)),
        animation: .default)
    private var myEntities: FetchedResults<EntityClassName>
    
    var body: some View {
        Text("Do Whatever you want with the CoreData data...")
            onAppear {
                // Create your class that needs the information and put it where you need it
                var myClass = MyClass(needsData: myEntities)
                // Do something with it, or not if it does all it needs to do on itself.
            }
    }
}

例如,当您在 onAppear 函数中使用数据时,您也可以将数据保存在单例中,然后在 NotificationDelegate 中从单例中获取信息。不是一个完美的解决方案,但它应该有效。

@Environment 由 SwuftUI 视图层次结构中的视图使用。您的 class NotificationDelegate 不是视图层次结构中的视图。

创建视图实例时,需要在初始化程序中将托管对象上下文传递给它。

我假设您当前正在尝试使用 .environmentObject() 传递它,因此请改为在初始化程序中传递它。

您不能在 View 之外使用 @Environment@FetchRequest “正确地” @Environment 得到初始化但通常不会更新。

要从 CoreData 获取数据,您必须使用 "old way"。您将在附件中看到包含更多信息的 link。它很旧,但很多内容仍然适用。

let moc = …
let employeesFetch = NSFetchRequest(entityName: "Employee")

do {
    let fetchedEmployees = try moc.executeFetchRequest(employeesFetch) as! [EmployeeMO]
} catch {
    fatalError("Failed to fetch employees: \(error)")
}