#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