#ios #sorting #firebase #transactions #firebase-realtime-database
#iOS #сортировка #firebase #транзакции #firebase-база данных в реальном времени
Вопрос:
В приложении для iOS я хотел бы предоставить пользователю возможность изменять порядок сортировки элементов в таблице (перетаскивая строку и помещая ее в новое местоположение).
Я структурировал данные в Firebase следующим образом:
{
"items": {
"id1": {
"title": "A",
"sortOrder": 2
},
"id2": {
"title": "B",
"sortOrder": 1
},
"id3": …
}
}
С помощью queryOrderedByChild(«Сортировщик») Я получаю элементы в правильном порядке B, A, …
Однако обновить данные после того, как пользователь изменил порядок сортировки, не так просто:
- Допустим, пользователь переключает A и B, тогда сортировщик A и B должен быть изменен «одновременно» в транзакции. Более того, если, скажем, F перемещается перед A, все промежуточные элементы должны быть скорректированы на 1.
- Если добавляется новый элемент, мы должны убедиться, что он получает следующий самый высокий порядок сортировки, поэтому, я думаю, нам нужно будет определить самый высокий порядок сортировки, добавить элемент с помощью SortOrder 1 . Если тем временем был добавлен другой элемент с таким порядком сортировки, мы должны отклонить первую попытку, повторить попытку с 2, 3 и т.д..
Я не уверен, что это правильный способ сделать это, не так ли? Возможно ли добиться такого поведения с помощью транзакций Firebase?
Комментарии:
1. Вы пробовали добавлять список в indexPath.row и обновлять свою базу данных, когда она изменяется для определенной строки /? Не проверял, а просто подумал …:)
2. Спасибо! Что я делаю сейчас: после того, как пользователь переместил строку, я соответствующим образом переупорядочиваю элементы в модели (обычный массив). Затем я использую массив для одновременного обновления всех элементов в Firebase с помощью SortOrder = index в массиве. Работает как шарм.