如何将数据预加载到 SwiftData 模型中?

use*_*305 5 swift swift-data

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)

我尝试使用扩展名预加载数据,但没有传递到视图。任何帮助都会很棒!

use*_*305 9

谢谢大家,但在这里找到了我的问题的一个很好的答案!

https://www.andrewcbancroft.com/blog/ios-development/data-persistence/pre-populate-swiftdata-persistent-store/

本篇博客详细介绍了如何使用@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)

  • 我开始使用它,但现在 Xcode 向我发出警告,表明这在 Swift6 中无效,因为“appContainer”不能标记为“@MainActor”。当我删除它时,它会抱怨“mainContext.fetch()”需要被“@MainActor”隔离。 (2认同)

wor*_*dog 2

例如,如果.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(...)