如果我将下面的代码放在结构视图中,则可以在swiftui列表中使用myShows,但是我试图在一个单独的类中执行相同的提取请求,如果尝试打印myShows或myShows [0]或类似的东西。我假设它永远不会初始化?我不确定。
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(
entity: MyShow.entity(),
sortDescriptors: [
NSSortDescriptor(keyPath: \MyShow.name, ascending: true)
]
)
var myShows: FetchedResults<MyShow>
答案 0 :(得分:1)
它“神奇地”在结构View
中而不是单独的类中工作的原因是因为这样的事情:
ContentView().environment(\.managedObjectContext, context)
已为该View
结构提供了一个\.managedObjectContext
环境对象,可以在其层次结构中使用该对象(自动)或将其传递给其他View
,但不是随机类。 * {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和简单的View Model设置的项目: