为什么 Apple 会创建一个单例结构并将其传递给环境?

Why Apple create a singleton struct and pass it to the environment?

提问人:Duck 提问时间:10/19/2023 更新时间:10/20/2023 访问量:65

问:

使用 Core Data 创建 App 时,Xcode 会创建一个名为 PersistenceController 的结构,该结构是单例。

struct PersistenceController {
    static let shared = PersistenceController()

    static var preview: PersistenceController = {
        let result = PersistenceController(inMemory: true)
        let viewContext = result.container.viewContext 

    ...

然后,当应用启动时,它们创建单一实例并将其传递给.environment()

@main
struct MyApp: App {
    let persistenceController = PersistenceController.shared

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.managedObjectContext, persistenceController.container.viewContext)
        }
    }
}

如果将 did 传递给环境,则 why did 被创建为单例。环境是否没有足够的容量来将单例保留在内存中?而且,使用共享选项来访问单例,而不需要将其传递给环境,难道不是很容易访问吗?PersistenceController

SwiftUI 结构 单例

评论


答:

2赞 lorem ipsum 10/19/2023 #1

如果你不想,你不必注射它,但有不明显的用途

@Environment(\.managedObjectContext) var managedObjectContext

@FetchRequest

如果你愿意,你可以省略,这取决于你的代码库,你会得到崩溃,说它丢失了。

Apple 使用单例是因为它可以防止存储被多次加载。

评论

0赞 Duck 10/19/2023
谢谢。我忘记了@FetchRequest......如果它被注入到环境中,然后在必要时从环境中调用它,它是否会多次加载?
0赞 lorem ipsum 10/19/2023
@Duck,如果你有static let
0赞 Duck 10/19/2023
明白了。再次感谢。
1赞 malhal 10/20/2023 #2

这样,你就可以在预览环境中使用预览单例,而无需更改视图代码。

评论

0赞 Duck 10/20/2023
啊,好抓!