Как создать базовую среду диспетчера данных в SwiftUI - PullRequest
1 голос
/ 11 июля 2020

Я новичок в SwiftUI и Core Data. Я узнал об наблюдаемых объектах, которые можно использовать в качестве объекта среды, чтобы загружать свои данные только один раз и делать их доступными для каждого представления. Там у меня был класс, соответствующий ObservableObject, и я мог публиковать sh свои локальные переменные / данные.

Теперь, когда я изучил 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 Data Manager (?), Чтобы мои данные были доступны, как в Observable Objects. . Или есть что-то еще лучше / проще?

Чтобы дать больше похоже на проблему реального мира: у меня есть сущность с категориями, и в представлениях человека моего приложения я вызываю запрос на выборку, чтобы получить доступ к категориям. Но имеет смысл загрузить их только один раз и передать нужным представлениям, и возникает вопрос: как? Надеюсь, в этом есть смысл.

1 Ответ

0 голосов
/ 11 июля 2020

Лучшим подходом является использование @FetchRequest один раз в MainView, а затем передача ваших сущностей в ваши подвиды.

Допустим, у вас есть FetchRequest в вашем ListView:

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

Затем в списке переберите все элементы и передайте их в ваше Subview как ObservedObject.

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

И в вашем DetailView объявите Foo как ObservedObject, который будет передан из родительского представления. Поскольку это ObservedObject, он автоматически обнаруживает изменения и обновляет ваше представление.

struct DetailView : View 
{
    @ObservedObject var foo : Foo

FetchRequest - одна из замечательных функций, которая делает SwiftUI и CoreData действительно замечательными в моем представлении. Каждый раз, когда вы создаете новую сущность, FetchRequest будет обновляться немедленно.

...