SwiftUI: Сохранение лайков в CoreData для каждой отдельной ячейки

swift
swiftui
ios
coredata

#1

Как мне сохранить состояние для каждой отдельной ячейки с помощью Core Data? Я решил сохранить через CoreData, но лайк сохраняется для всех ячеек сразу.

В модели Core Data есть такой атрибут, как isLiked

В классе есть переменная isLiked, которая изменяет состояние лайка:

class ModelsViewModel: ObservableObject{

    @Published var isLiked = false

    func like() {
        isLiked.toggle()
    }
}

Вот как я сохраняю состояние лайка из Model ViewModel
И в label я использую уже

struct CellView: View{
    
   //For CoreData
    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(entity: LikedDBE.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \LikedDBE.name, ascending: true)]) var manyLikedDB: FetchedResults<LikedDBE>

    //For like
    @ObservedObject var cellViewModel: ModelsViewModel = ModelsViewModel()

    var body: some View{

        Button(action: {
        let likedDBE = LikedDBE(context: self.managedObjectContext)
        likedDBE.isLiked = cellViewModel.isLiked

        do{
            cellViewModel.like() //func from ModelsViewModel()
            try self.managedObjectContext.save() //Save
        } catch{
            print(error)
        }

        }, label: {
        Image(systemName: cellViewModel.isLiked ? "heart.fill" : "heart") //Хочу использовать likedDB.isLiked тут
           .frame(width: 22, height: 22)
           .foregroundColor(cellViewModel.isLiked ? .red : .black) //И хочу использовать likedDB.isLiked тут
})

И если я использую сellViewModel.isLiked, то когда я нажимаю на лайк, лайк отображается только на той ячейке, на которую я нажал, но состояние не сохраняется при перезапуске приложения, если я использую likedDB.isLiked, то “нравится” отображается во всех ячейках сразу, но “нравится” сохраняется после перезапуска,.

Я хочу, чтобы лайк был только в ячейке, на которую я нажал, и она будет сохранена после перезапуска приложения.


#2
Button(action: {
    let likedDBE = LikedDBE(context: self.managedObjectContext)
    likedDBE.isLiked = cellViewModel.isLiked

Непонятно, зачем вы создаёте сущности внутри Cell по нажатию на кнопку?
Зачем вы в каждой ячейке запрашиваете одни и те же сущности?

Запрос сущностей у вас должен быть в корневом вью, где список.
Внутри списка List/ForEach в получаете отдельные элементы списка. Отдельный элемент передаёте в CellView в параметр, например, @State var item: LikedDBE. По нажатию на копку у этого элемента меняете item.isLiked и сохраняете контекст. Вьюмодель с этим параметром тут не нужна.