Изменение порядка строк в табличном представлении и сохранение порядка после перезагрузки или закрытия приложения

#ios #swift #uitableview #tableview #nsuserdefaults

#iOS #swift #uitableview #tableview #nsuserdefaults

Вопрос:

У меня есть tableview, и я хотел бы, чтобы пользователь мог перемещать ячейки в любом порядке, в котором они хотели бы. Ячейки — это объекты, которые извлекаются из базы данных в серверной части, поэтому, когда пользователь перезагружает или закрывает приложение, порядок, в котором они изменили ячейки, не сохраняется, и он продолжает захватывать тот же порядок, в котором они были добавлены в приложение. Я попытался сохранить это в UserDefaults, приложение вылетает с сообщением

 Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object (
    "Myapp.Animal",
    "Myapp.Animal",
    "Myapp.Animal"
) for key sortedanimals'
 

Я понимаю, что не могу сохранить весь объект в UserDefaults, но я в замешательстве и не знаю, как я могу сохранить только порядок в UserDefaults.

Это функции tableview, в которых пользователь может перетаскивать ячейки в tableview:

 func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
    let dragItem = UIDragItem(itemProvider: NSItemProvider())
    dragItem.localObject = allAnimals[indexPath.row]
    return [ dragItem ]
}

func tableView(_ tableView: UITableView, moveRowAt indexPath: IndexPath, to: IndexPath) {
    let mover = allAnimals.remove(at: indexPath.row)
    allAnimals.insert(mover, at: to.row)
    UserDefaults.standard.set(allAnimals, forKey:"sortedanimals") //this is where the app crashes,
}

func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) {
    
}
 

Мой внутренний код не указывает интерфейсу устанавливать ячейки в каком-либо определенном порядке, он просто по умолчанию использует их в порядке идентификатора (или порядке, в котором они были добавлены в приложение)

Я просмотрел stackoverflow, но не могу найти никаких вопросов, где они пытаются изменить порядок данных, поступающих из серверной части, только переупорядочивая данные, которые создаются внутри интерфейса. Возможно ли это вообще с помощью UserDefaults?

Редактировать:

Теперь я создал массив, в котором перечислены все идентификаторы объектов в том порядке, в котором они были реорганизованы. Однако я не знаю, как реорганизовать данные, полученные из серверной части, в том порядке, в котором я хотел бы, чтобы они были упорядочены. Это созданный мной массив. Нужно ли мне отправлять этот массив на серверную часть для реорганизации, или я должен сделать это во внешнем интерфейсе?

 let ids = allAnimals.map { $0.id }
 

Комментарии:

1. Вы должны добавить индекс или уникальный идентификатор к модели. Затем сохраните это и отсортируйте элементы по индексу или uuid. Сохранение целых объектов, которые в любом случае повторно извлекаются, не имеет смысла

2. Вы говорите, что объекты имеют id . Предполагая, что это просто Int или строка, вы можете сохранить их массив в UserDefaults, а затем использовать его для сортировки данных, которые вы извлекаете из серверной части.

3. Спасибо за ответы. Я создал массив каждого идентификатора объекта в том порядке, в котором они были реорганизованы. Каким будет мой следующий шаг к сортировке данных, которые я извлекаю из серверной части?