SwiftUI после блокировки экрана Список зависает на несколько секунд - PullRequest
0 голосов
/ 07 апреля 2020

У меня 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.

Кто-нибудь знает, почему это происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...