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)")
}
我正在尝试从通知代理中的核心数据实体中获取 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)")
}