gpt4 book ai didi

core-data - 允许 ComplicationController 访问 CoreData SwiftUI

转载 作者:行者123 更新时间:2023-12-03 20:50:44 24 4
gpt4 key购买 nike

在使用 SwiftUI 的 Xcode 12 beta 2 中,我希望我的 ComplicationController 发出 FetchRequest 以更新我的并发症,但我无法将持久存储注入(inject)环境。
我应该注意到这是 watchOS 中的纯 SwiftUI 应用程序,其中应用程序入口点是 @main 结构。没有 ExtensionDelegate 或 HostingController。
对于 watchOS 应用程序本身,这就是我设置 PersistentContainer 的方式:

struct RunPlanner: App {
@Environment(\.scenePhase) private var scenePhase
@StateObject private var persistentStore = PersistentStore.shared
@ObservedObject var selection = TabSelection()

var body: some Scene {
WindowGroup {
TabView(selection: $selection.currentTab) {
WatchAddRunView(tabSelection: selection)
.tag(0)
ContentView()
.tag(1)
}
.environment(\.managedObjectContext, persistentStore.context)
.animation(.easeIn)
}
.onChange(of: scenePhase) { phase in
switch phase {
case .active:
print("\(#function) REPORTS - App change of scenePhase to ACTIVE")
case .inactive:
print("\(#function) REPORTS - App change of scenePhase to INACTIVE")
case .background:
print("\(#function) REPORTS - App change of scenePhase to BACKGROUND")
savePersistentStore()
default:
print("\(#function) REPORTS - App change of scenePhase Default")
}
}
}

func savePersistentStore() {
persistentStore.saveContext()
}
}
这适用于应用程序本身将值保存到 CoreData 但是我的 ComplicationController 没有看到 NSPersistentStoreContainer 并且我不确定如何注入(inject)它。
我目前在 ComplicationController 类中的尝试是这样的:
class ComplicationController: NSObject, CLKComplicationDataSource {
@Environment(\.managedObjectContext) var moc

let request = NSFetchRequest<RunEvents>(entityName: "RunEvents")
....complication code...
}

func getSavedRunName() -> String {
var activeName = "Run Roster"
do {
let savedRuns = try moc.fetch(request)
savedRuns.forEach({
if $0.isActive {
guard let fetchedName = $0.name else { return }
activeName = fetchedName
}
})
} catch {
print("Error in Fetch Request")
}

return activeName
}
但是,getSavedRunName 方法将导致应用程序在执行时崩溃,调试器会说“原因:'+entityForName:nil 不是用于搜索实体名称'RunEvents''的合法 NSPersistentStoreCoordinator”
我已经搜索并摸索了各种解决方案,但没有得到积极的结果。非常感谢这里的任何见解。
-担

最佳答案

CLKComplicationDataSource 是一个独立于 WKExtensionDelegate 的独立可执行文件,因此您需要在每个文件中设置您的 CoreData 堆栈。此外,您使用 App Group 来共享相同的 Core Data 文件。我从我的所有目标中使用这样的扩展。

extension NSPersistentContainer {

static func appContainer() -> NSPersistentContainer {
let container = NSPersistentContainer(name: AppConstants.databaseName)

let storeURL = URL.storeURL(for: AppConstants.appGroupName, databaseName: AppConstants.databaseName)
let storeDescription = NSPersistentStoreDescription(url: storeURL)
container.persistentStoreDescriptions = [storeDescription]

container.loadPersistentStores { storeDescription, error in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
}
return container
}

}
请注意,将扩展中所做的更改同步回应用程序的上下文中需要额外的工作待定。我的并发症(和小部件)是只读的,操作系统按需运行它们,因此它们初始化为新鲜的和最新的。
跨设备同步时,我使用 CloudCore

关于core-data - 允许 ComplicationController 访问 CoreData SwiftUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63035601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com