Я экспериментирую с SwiftUI и CoreData. В ListView я показываю все записи с данным предикатом через FetchRequest
:
struct MyList: View {
var task: Task
@FetchRequest
var events: FetchedResults<Event>
@Environment(\.managedObjectContext)
var viewContext
init(task: Task) {
self.task = task
self._events = FetchRequest(entity: Event.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Event.timestamp, ascending: true)],
predicate: NSPredicate(format: "%K == %@", #keyPath(Event.task), task.id.uuidString), animation: .default)
}
var body: some View {
VStack {
EditButton()
List {
ForEach(self.events, id: \.self) { event in
Text("\(event.someProperty)")
}
}.onDelete { indices in
self.events.delete(at: indices, from: self.viewContext)
}
}
.navigationBarItems(
trailing: Button(
action: {
withAnimation {
Event.create(for: self.task, in: self.viewContext)
}
}
) {
Image(systemName: "plus")
}
)
}
}
extension Event {
static func create(for task: Task, in managedObjectContext: NSManagedObjectContext){
let newEvent = self.init(context: managedObjectContext)
newEvent.task = task.id
newEvent.timestamp = Date()
do {
try managedObjectContext.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
}
extension Collection where Element == Event, Index == Int {
func delete(at indices: IndexSet, from managedObjectContext: NSManagedObjectContext) {
indices.forEach { managedObjectContext.delete(self[$0]) }
do {
try managedObjectContext.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
}
Все работает, если хорошо. Если я удаляю запись, она автоматически удаляется из списка.
Но если я добавляю запись, она добавляется в список только после перезапуска приложения. Если я удаляю NSPredicate
новые записи отображаются сразу. Это ошибка или я что-то упустил? Спасибо за вашу помощь.