Список SwiftUI не обновляется должным образом после изменения NSManagedObject - PullRequest
0 голосов
/ 22 марта 2020

У меня есть список с двумя разделами, которые заполнены двумя @FetchRequest s с разными предикатами - первый получает объекты, где их значение date равно нулю, а второй получает объекты, где их значение date не равно нулю. Когда вы создаете объект, ячейка вставляется в раздел 1 и называется «У объекта нет даты», как и ожидалось. Затем, когда вы даете ей date, строка перемещается в раздел 0, но она по-прежнему называется «У сущности нет даты», что является неожиданным.

Для воспроизведения поместите этот код в проект и создать MyEntity с полем даты. Запустите приложение и нажмите «Создать объект». Создается NSManagedObject, в разделе 1 появляется ячейка с заголовком «У объекта нет даты», как и ожидалось. Через пару секунд этот объект извлекается, его дата устанавливается и контекст управляемого объекта сохраняется. Это приводит к тому, что ячейка перемещается в раздел 0, но она по-прежнему имеет заголовок «У сущности неожиданно нет даты». Теперь он должен называться «У сущности есть дата». Если вы закроете и снова откроете приложение, оно будет правильно названо.

Теперь довольно интересно, если я уберу второй @FetchRequest, удалим предикат из первого @FetchRequest, чтобы он выбирал все объекты и использовал только один раздел в списке, он корректно обновляет Text, когда установлен date.

struct ContentView: View {
    @Environment(\.managedObjectContext) private var managedObjectContext

    @FetchRequest(entity: MyEntity.entity(), sortDescriptors: [
        NSSortDescriptor(keyPath: \MyEntity.date, ascending: false)
    ], predicate: NSPredicate(format: "date != nil")) private var entitiesWithDate: FetchedResults<MyEntity>

    @FetchRequest(entity: MyEntity.entity(), sortDescriptors: [], predicate: NSPredicate(format: "date == nil")) private var entitiesWithoutDate: FetchedResults<MyEntity>

    var body: some View {
        NavigationView {
            List {
                Section(header: Text("Date"), content: {
                    ForEach(entitiesWithDate) { _ in
                        Text("Entity has a date")
                    }
                })
                Section(header: Text("No Date"), content: {
                    ForEach(entitiesWithoutDate) { _ in
                        Text("Entity does not have a date")
                    }
                })
                Button(action: createEntity, label: {
                    Text("Create Entity")
                })
            }
            .listStyle(GroupedListStyle())
            .navigationBarTitle("Hello ?")
        }
    }

    func createEntity() {
        let newEntity = MyEntity(context: managedObjectContext)
        newEntity.date = nil

        try! managedObjectContext.save()

        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            self.updateEntity()
        }
    }

    func updateEntity() {
        let fetchRequest: NSFetchRequest<MyEntity> = MyEntity.fetchRequest()
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true)]
        let results = try! managedObjectContext.fetch(fetchRequest)
        let entity = results.first!

        entity.date = Date()

        try! managedObjectContext.save()
    }
}

extension MyEntity: Identifiable {
    public var id: NSManagedObjectID {
        return objectID
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...