繁体   English   中英

如何在 SwiftUI 中创建核心数据管理器环境

[英]How to create a core data manager environment in SwiftUI

我对 SwiftUI 和核心数据相当陌生。 我了解了可观察对象,我可以将其用作环境 object 以仅加载我的数据一次并使其可用于每个视图。 在那里,我有一个符合ObservableObject的 class 并且我可以发布我的局部变量/数据。

现在,我学习了 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以与 arrays 一起使用。 在我看来,每次我需要一个核心数据实体时,我都会调用:

@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Foo.date, ascending: false)]) var foos: FetchedResults<Foo>

我的问题是,如何创建一个 Cora 数据管理器 Class (?) 让我的数据像在可观察对象中一样可用。 还是有更好/更容易的东西?

给出更像现实世界的问题:我有一个带有类别的实体,在我的应用程序的人视图中,我调用 fetch 请求来访问类别。 但这是有道理的,只加载一次并将其传递给所需的视图,问题是:如何? 希望,这是有道理的。

最好的方法是在 MainView 中使用一次@FetchRequest ,然后将您的实体传递给您的子视图。

假设您的 ListView 中有您的 FetchRequest:

@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Foo.date, ascending: false)]) var foos: FetchedResults<Foo>

然后在 List 中,遍历所有元素并将它们作为 ObservedObject 传递给您的 Subview。

List { ForEach(self.foos, id:.self) { DetailView 中的 foo(item: foo) }

在您的 DetailView 中,将 Foo 声明为 ObservedObject,它将从父视图传递。 由于它是ObservedObject ,它会自动检测更改并更新您的视图。

struct DetailView : View 
{
    @ObservedObject var foo : Foo

FetchRequest 是伟大的功能之一,它使 SwiftUI 和 CoreData 在我看来非常棒。 每当您创建新实体时,FetchRequest 都会立即更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM