如何在 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 中创建核心数据管理器环境的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中创建指数

如何在 SwiftUI 中创建图像按钮

如何在 swiftUI 中创建一个普通视图

如何在 SwiftUI 中创建分段按钮?

如何在网络核心Web应用程序中创建任务包装器或中间件?

SwiftUI 中的核心数据