如何在 SwiftUI 中创建核心数据管理器环境
Posted
技术标签:
【中文标题】如何在 SwiftUI 中创建核心数据管理器环境【英文标题】:How to create a core data manager environment in SwiftUI 【发布时间】:2020-07-11 08:38:25 【问题描述】:我对 SwiftUI 和 Core Data 比较陌生。我了解了可观察对象,我可以将其用作环境对象,仅加载一次数据并使其可用于每个视图。
在那里,我有一个符合ObservableObject
的类,我可以发布我的局部变量/数据。
现在,我学习了 Core Data,我想知道如何做一些熟悉的事情。 当我创建我的实体和关系时,我得到了一些链接:
extension Foo
@nonobjc public class func fetchRequest() -> NSFetchRequest<Foo>
return NSFetchRequest<Foo>(entityName: "Foo")
@NSManaged public var name: String
@NSManaged public var date: Date
@NSManaged public var bars: NSSet
public var barsArray: [Bar]
let set = bars as? Set<Bar> ?? []
return Array(set)
我创建了barsArray
来处理数组。
在我看来,每次需要核心数据实体时,我都会调用:
@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Foo.date, ascending: false)]) var foos: FetchedResults<Foo>
我的问题是,如何创建一个 Cora 数据管理器类 (?) 以使我的数据像可观察对象一样可用。还是有更好/更简单的东西?
为了给出更像现实世界的问题:我有一个带有类别的实体,在我的应用程序的人视图中,我调用 fetch 请求来访问类别。但这是有道理的,只加载一次并将其传递给所需的视图,问题是:如何?希望,这是有道理的。
【问题讨论】:
【参考方案1】:最好的方法是在 MainView 中使用一次@FetchRequest
,然后将您的实体传递给您的子视图。
假设您的 ListView 中有 FetchRequest:
@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Foo.date, ascending: false)]) var foos: FetchedResults<Foo>
然后在列表中,遍历所有元素并将它们作为 ObservedObject 传递给您的子视图。
列表 ForEach(self.foos, id:.self) foo in DetailView(项目:foo)
并在您的 DetailView 中,将 Foo 声明为 ObservedObject,它将从父视图传递。因为它是ObservedObject
,它会自动检测更改并更新您的视图。
struct DetailView : View
@ObservedObject var foo : Foo
FetchRequest 是一个很棒的功能,它让 SwiftUI 和 CoreData 在我的视图中非常棒。每当您创建新实体时,FetchRequest 都会立即更新。
【讨论】:
您好,感谢您的回复。你的答案是我已经拥有的。我想将 FetchRequest 移出“ListView”,因为我有多个访问 fetch 请求的 ListView。比方说“高一级”。 在多个视图中复制 FetchRequest 没有任何问题,至少在获取新数据时不进行任何密集的后期处理时是这样。以上是关于如何在 SwiftUI 中创建核心数据管理器环境的主要内容,如果未能解决你的问题,请参考以下文章