为啥核心数据不会在 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 环境对象,它可以使用或传递给它的层次结构中的其他Views(自动),但不是随机类。*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 和简单视图模型设置的项目:

https://github.com/StephenMcMillan/Dub-Dub-Do

【讨论】:

以上是关于为啥核心数据不会在 swiftui 类中加载,但会在结构视图中加载的主要内容,如果未能解决你的问题,请参考以下文章

如何在视图启动之前在 SwiftUI 中加载更新的变量?

为啥在下拉列表中加载组件时不会触发 ngmodelChange 事件?

在 swiftUI 中加载图像在展开时导致 nil

在 SwiftUI 中加载网站时加载活动指示器

Json 未在 SwiftUI 中加载

在列表中加载 WebView 而无需重新加载 webView 内容 SwiftUI