如何仅在首次应用启动时初始化 SwiftData 实例?

问题描述 投票:0回答:1

我需要一些有关 SwiftData 的帮助。我希望仅在应用程序第一次打开时创建我的 SwiftData 类之一的一些实例。这些实例应在应用程序首次打开时创建一次,而不是在后续启动时创建。我尝试过对它们进行硬编码,但 SwiftData 给我带来了这种方法的问题。 SwiftData 似乎需要由应用程序本身创建实例,而不是硬编码。是否有正确的方法仅在第一次应用程序启动时初始化这些实例?

我是初学者,非常感谢任何帮助。谢谢!

这是 Swift-Data-Class 的示例:

@Model
class TexEmoji {
    let id: UUID
    var text: String
    var emoji: String
    
    init(text: String, emoji: String) {
        self.id = UUID()
        self.text = text
        self.emoji = emoji
    }
}

这是我为@main App 尝试的代码


@main
struct PersonalAdviceApp: App {
    @Environment(\.modelContext) private var context
    func checkFirstLaunch() {
            let hasLaunchedBefore = UserDefaults.standard.bool(forKey: "hasLaunchedBefore")
            if !hasLaunchedBefore {
               let instance1: TexEmoji = TexEmoji(text: "Standard-Text 1", emoji: "😃")
               context.insert(instance1)
               let instance2: TexEmoji = TexEmoji(text: "Home-Page", emoji: "🏠")
               context.insert(instance2)
               UserDefaults.standard.set(true, forKey: "hasLaunchedBefore")
            }   
        }
    var body: some Scene {
        WindowGroup {
            TestPage()
                .modelContainer(for: [Ergebnis.self, Seite.self, TexEmoji.self])
                .onAppear {checkFirstLaunch()}
        }
    }
}

不幸的是我总是收到以下错误:

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“无法在此托管对象上下文中插入“TexEmoji”,因为在关联的托管对象模型中找不到它。”

swift launch swiftdata swift-data-modelcontext
1个回答
0
投票

让 ModelContainer 成为应用程序结构中的一个属性,并在其声明中进行设置

var sharedModelContainer: ModelContainer = {
    let schema = Schema([
        Ergebnis.self, Seite.self, TexEmoji.self
    ])
    let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)

    do {
        let container = try ModelContainer(for: schema, configurations: [modelConfiguration])
        checkFirstLaunch(context: container.mainContext)
        return container
    } catch {
        fatalError("Could not create ModelContainer: \(error)")
    }
}()

通过此设置,我建议在 checkFirstLaunch 结束时在模型上下文上调用 save() 。

然后您需要更改场景主体属性中的修改器

.modelContainer(sharedModelContainer)
© www.soinside.com 2019 - 2024. All rights reserved.