У меня SwiftUI List, загруженный ячейками из CoreData @FetchRequest, но этот список зависает после блокировки / разблокировки экрана.
Я не использую id () в списке или разделах Я использую id: .1 => означает, что каждый NSManagedObject уникально идентифицирует строку списка
ForEach(Array(objects.enumerated()), id: \.1) { (i, object) in
ObjectRow(object: object)
.onAppear {
self.viewModel.infiniteLoading(i)
}
}
Я рассматриваю, почему этот список зависает после разблокировки
Я видел, что могу добавить .id(UUID())
во весь список, чтобы сделать что-то похожее на tableView.reloadData()
Я думаю, что это не подходит в моем случае.
Я также заметил, что изменение этого кода на использование id: .0 решает проблему, и теперь он не зависает после блокировки / разблокировки экрана
ForEach(Array(objects.enumerated()), id: \.0) { (i, object) in
ObjectRow(object: object)
.onAppear {
self.viewModel.infiniteLoading(i)
}
}
Но здесь объекты могут обновляться в базе данных (Базовые данные) и сортируются так, что новые элементы появляются в верхней части списка. Итак, массив 0 -> строка 0! = Массив 1 -> строка 0. Кажется, что это работает, но это не кажется логически правильным.
NSManagedObjects являются Hashable, я думаю, поэтому они должны быть идентифицируемы его свойством objectID. Может быть, после пробуждения приложения с экрана блокировки все они равны нулю?
ОБНОВЛЕНИЕ
Эта версия также работает, где id: .1.objectId вместо .1
ForEach(Array(objects.enumerated()), id: \.1.objectID) { (i, object) in
ObjectRow(object: object)
.onAppear {
self.viewModel.infiniteLoading(i)
}
}
Но используя мое собственное свойство id (загруженное из API)
ForEach(Array(objects.enumerated()), id: \.1.id) { (i, object) in
ObjectRow(object: object)
.onAppear {
self.viewModel.infiniteLoading(i)
}
}
Это также зависает. Кроме того, идентификатор это строка? Необязательный, поскольку все свойства Core Data являются необязательными, даже если мы снимем флажок Необязательный в модели CoreData.
Кто-нибудь знает, почему это происходит?