为啥 Core Data 上下文对象必须通过环境变量传递?

Posted

技术标签:

【中文标题】为啥 Core Data 上下文对象必须通过环境变量传递?【英文标题】:Why does Core Data context object have to be passed via environment variable?为什么 Core Data 上下文对象必须通过环境变量传递? 【发布时间】:2020-09-18 18:01:22 【问题描述】:

SceneDelegate 内部,上下文是通过.environment(\.managedObjectContext, context) 传递的,为什么不能通过View 的属性传递呢?这样做有什么好处?

所以不要在下面做

let contentView = FlightsEnrouteView()
    .environment(\.managedObjectContext, context)

我们可以通过视图的初始化器传递上下文

let contentView = FlightsEnrouteView(context: context)

所以里面FlightsEnrouteView应该是,

struct FlightsEnrouteView: View 
    var context: NSManagedObjectContext

测试它并编译

【问题讨论】:

【参考方案1】:

为什么不能通过 View 的属性传递?这样做有什么好处?

可以。只是它被环境中的@FetchRequest 等其他包装器使用,但没有人阻止你组合它们,因为上下文是引用类型的对象,所以你可以随意传递它的引用。

所以以下是绝对有效的:

let contentView = FlightsEnrouteView(context: context)
    .environment(\.managedObjectContext, context)

struct FlightsEnrouteView: View 
    @EnvironmentObject(\.managedObjectContext) var envContext
    var context: NSManagedObjectContext

【讨论】:

以上是关于为啥 Core Data 上下文对象必须通过环境变量传递?的主要内容,如果未能解决你的问题,请参考以下文章

如果您想通过 Core Data 使用多个实体,您需要为每个实体提供一个托管对象上下文吗?

在 Core Data 中插入一个新的托管对象

如何使用 Core Data 设置 NSArrayController?

当应用程序后台运行时,Core Data 无法通过区域监控保存上下文

在 GC 环境中,Core Data 啥时候会释放其分配的内存?

防止托管对象被 Core Data 再次出错