SwiftUI Как получить изменения вычисляемого свойства подкласса NSManagedObject

#ios #core-data #swiftui

#iOS #core-данные #swiftui

Вопрос:

Я использую a List для отображения моделей отношений CoreData «один ко многим». В списке отображалось вычисляемое свойство. Когда NSManagedObject был изменен, вычисляемое свойство не знает об этом.

Допустим People , имеет много Book s. Как в приведенном ниже коде:

People CoreDataProperties.swift

   extension People {
    @nonobjc public class func fetchRequest() -> NSFetchRequest<Contract> {
        return NSFetchRequest<People>(entityName: "People")
    }

    @NSManaged public var peopleID: String?
    @NSManaged public var name: String?
    @NSManaged public var books: Set<Book>?
    @NSManaged public var bookOrders: [String]

   }
  

Это bookOrders упорядоченный идентификатор книг.

BookListView.swift

 struct BookListView: View {
   @state var people: People //this is from @FetchRequest
   
   List {
       ForEach(people.sortedBooks.indices, id:.self) { index in
            BookRowView(bookListItem: viewModel.books[index])
       }
   }
    
}
  

Вот расширение People:

 extension People {
    var sortedBooks: [Book] {
    
    
    let contractMapping = books.reduce(into: [String: Book]()) { (result, book) in
        result[book.bookID] = book
    }
    return bookOrders.map {
        contractMapping[$0]
    }.compactMap { $0 }

}
  

Итак, когда я переупорядочиваю книги, в которых говорится обновить bookOrders или есть фоновый запрос на обновление добавления новых книг, как я могу уведомить BookListView об обновлении представления?

Ответ №1:

Внутри BookListView объявите своих людей как ObservedObject

 struct BookListView: View {
   @ObservedObject var people: People // << now View updates for any changes here