为啥核心数据不会在 swiftui 类中加载,但会在结构视图中加载
Posted
技术标签:
【中文标题】为啥核心数据不会在 swiftui 类中加载,但会在结构视图中加载【英文标题】:Why won't core data load in a swiftui class, but it will in a struct view为什么核心数据不会在 swiftui 类中加载,但会在结构视图中加载 【发布时间】:2020-04-14 02:49:47 【问题描述】:如果我将下面的代码放在结构视图中,我可以在 swiftui 列表中使用 myShows,但我试图在单独的类中执行相同的获取请求,如果我尝试打印 myShows 或myShows[0] 或类似的东西。我假设它永远不会被初始化?我不知道。
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(
entity: MyShow.entity(),
sortDescriptors: [
NSSortDescriptor(keyPath: \MyShow.name, ascending: true)
]
)
var myShows: FetchedResults<MyShow>
【问题讨论】:
你会提供整个类的代码并实例化/设置它吗? 这就是我拥有的所有代码。它只是在 swiftui 视图中神奇地工作,但我假设在一个单独的类中,我需要将获取请求结果放入 myShows,我不知道该怎么做。 【参考方案1】:它“神奇地”在结构 View
而不是单独的类中工作的原因是因为这样的:
ContentView().environment(\.managedObjectContext, context)
这个View
结构已经提供了一个\.managedObjectContext
环境对象,它可以使用或传递给它的层次结构中的其他View
s(自动),但不是随机类。*Ref支持>
此外,@FetchRequest
仅在设置了上述环境对象时才有效。*Ref
因此,如果您尝试在随机类中访问以下内容:
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(entity: Something.entity(), sortDescriptors: []))
var something: FetchedResults<Something>
它不会工作,因为它不会像另一个 View
那样自动继承环境。
因此它无法访问 Core Data 的 ManagedObjectContext
实例,因此 @FetchRequest
也会失败。
要解决这个问题,最粗暴的方法是将环境对象通过它的初始化程序传递给Class
,然后在内部正常处理它。
或者您可以转向 MVVM 模式并做一些不同的事情,但这完全是另一个话题。
如果您有兴趣,可以看看这个使用 Core Data 和简单视图模型设置的项目:
【讨论】:
以上是关于为啥核心数据不会在 swiftui 类中加载,但会在结构视图中加载的主要内容,如果未能解决你的问题,请参考以下文章