У вас есть пара проблем. Во-первых, когда вы используете ForEach
, если предполагается, что ваш контент может изменяться (что, с FetchRequest
это ...), то либо FavoriteBooks
должно быть Identifiable
, либо вам нужно передать в вашем id
. Фактически вы делаете это дважды в коде:
ForEach(0 ..< bookData.booksData.count) { num in
// SwiftUI thinks this content never changes because it doesn't know how to resolve those changes. you didn't tell it
}
должно быть:
ForEach(0 ..< bookData.booksData.count, id: \.self) { ... }
Обратите внимание, теперь вы сообщаете ему, что такое идентификатор. Если количество bookData.booksData
изменится, теперь SwiftUI может исправить эти изменения. Но действительно, зачем именно в этом случае нужен индекс? Почему не просто:
ForEach(bookData.booksData) { book in ... }
Если вы сделаете этот тип объекта совместимым с Identifiable
, теперь у вас уже есть книга.
Теперь перейдем к другой проблеме, действию вашей кнопки. Почему вы повторно выполняете запрос CoreData здесь? У вас есть Set
нужных вам объектов. Это еще одна причина просто использовать ForEach(bookData.booksData)
, здесь вам не нужно разрешать индекс. Но в целом вам не следует никогда повторно выполнять запрос основных данных, чтобы найти определенный c объект. на самом деле это вызывает еще одно обновление всей иерархии представлений, что, вероятно, является причиной того, что вы получаете ошибку, которую получаете. вы не должны этого делать.