У меня есть список с двумя разделами, которые заполнены двумя @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
}
}