Отличный вопрос и ответ, который действительно демонстрирует возможность реального обновления Realms.
Повторяю вопрос
У пользователя есть задачи, и мы хотим работать с этими задачами в порядке
список, и если есть изменения в заказе, сохраняйте их в порядке, указанном новым заказом
Используя два класса, представленных в вопросе, у нас есть кнопка, которая вызывает функцию для запроса области для пользователя и сохранения этого пользователя в классе var
var myUser: UserClass!
func loadUser() {
if let realm = gGetRealm() { //my code to connect to Realm
let userResults = realm.objects(UserClass.self)
if userResults.count > 0 {
let user = userResults[0]
self.myUser = user
}
}
}
затем кнопка, которая вызывает функцию, чтобы просто распечатать задачи пользователей, упорядоченные по приоритету
func printOrderedTasks() {
let sortedTasks = self.myUser.tasks.sorted(byKeyPath: "priority")
for task in sortedTasks {
print(task)
}
}
Таким образом, для этого примера я создал 4 задачи, добавил их в список задач пользователя и записал пользователя в область. Первоначальный порядок приоритетов: 10, 0, 1, 4
Затем loadUser загружает и сохраняет первого доступного пользователя и назначает его классу var.
printOrderedTasks выводит задачи в порядке возрастания. Таким образом, после загрузки пользователя, нажав printOrderedTasks, вывод будет
0
1
4
10
затем, используя Realm Studio, измените 1 на 6 и снова нажмите printOrderedTasks, и вы получите
0
4
6
10
без перезагрузки.
Объекты Realm обновляются в реальном времени, поэтому, если в вашем коде есть ссылка на них, любые изменения отражаются в реальном времени.
Вы можете расширить это, добавив наблюдателя к этому объекту, и Realm уведомит приложение о событии, к которому вы можете перезагрузить tableView или сообщить пользователю об изменении.
Edit:
Чтобы продвинуться дальше, пользовательские задачи также являются живыми объектами обновления, и если вы установите для них сортировку, эти результаты сохранят свою сортировку.
Например, давайте перепишем приведенный выше код, чтобы отслеживать задачи пользователей, которые поддерживают живую сортировку. Я переписал приведенный выше код, исключил пользовательский класс var и добавил класс задач var. Обратите внимание, что нам никогда не нужно повторно сортировать задачи, порядок сортировки устанавливается изначально, и они будут сортироваться с этого момента.
var myUserTasks: Results<TaskClass>!
func loadUserAndGetTasks() {
if let realm = gGetRealm() {
let userResults = realm.objects(UserClass.self)
if userResults.count > 0 {
let user = userResults[0]
self.myUserTasks = user.tasks.sorted(byKeyPath: "priority")
}
}
}
func printTasks() {
for t in self.myUserTasks {
print(t)
}
}
Первоначальный заказ был 10, 0, 1, 4, как указано выше. Если затем мы изменим 1 на шесть с помощью Realm Studio, а затем запустим функцию printTasks, вы увидите, что упорядочивание было выполнено автоматически, потому что результаты обновляются в реальном времени.
0
4
6
10
Крутая вещь в том, что вам не нужно продолжать прибегать к заданиям - они поддерживают порядок сортировки.