import Foundation
import SwiftData
@Model class Example: {
let name: String
let type: String
init(name: String, type: String) {
self.name = name
self.type = type
}
}
//Then in the View
@Query var doors: [Door]
Run Code Online (Sandbox Code Playgroud)
SwiftData 是 Apple 在 WWDC 20223 上推出的新框架,这可能是一个愚蠢的问题,但我似乎无法在这里找到最佳实践。我可以让用户添加示例,但我看不到如何在代码级别添加它们。
extension Example {
static let examples: [Example] = [
Example(
name: "ex1",
type: "red"
),
Example(
name: "ex2",
type: "blue"
)
]
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用扩展名预加载数据,但没有传递到视图。任何帮助都会很棒!
谢谢大家,但在这里找到了我的问题的一个很好的答案!
本篇博客详细介绍了如何使用@MainActors来完成这个功能
@MainActor
let appContainer: ModelContainer = {
do {
let container = try ModelContainer(for: Item.self)
// Make sure the persistent store is empty. If it's not, return the non-empty container.
var itemFetchDescriptor = FetchDescriptor<Item>()
itemFetchDescriptor.fetchLimit = 1
guard try container.mainContext.fetch(itemFetchDescriptor).count == 0 else { return container }
// This code will only run if the persistent store is empty.
let items = [
Item(timestamp: Date()),
Item(timestamp: Date()),
Item(timestamp: Date())
]
for item in items {
container.mainContext.insert(object: item)
}
return container
} catch {
fatalError("Failed to create container")
}
}()
Run Code Online (Sandbox Code Playgroud)
例如,如果.onAppear()还没有examples加载它们,您可以尝试这种方法,如示例代码所示:
.onAppear {
if examples.isEmpty {
for ex in Example.examples {
modelContext.insert(ex) // <--- here
}
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以在第一次使用应用程序时从文件中读取初始数据并将其加载examples到 中。SwiftData方法有很多,最后使用类似:modelContext.insert(...)