Realm Swift: всегда добавляет значения nil в сортировку

Я пишу приложение в Swift 2.2, нацеленное на iOS 8 и использующее Realm. Я разрешаю пользователю сортировать объекты на основе различных необязательных свойств с помощью Results.sorted(_:ascending:). Это работает очень хорошо для нисходящих сортировок, но для восходящих сортировок сначала ставятся значения nil, которые выглядят неправильно. Многие системы баз данных имеют параметр NULLS FIRST/LAST и с CoreData, это похоже на подкласс NSSortDescriptor. Есть ли способ всегда ставить значения nil при сортировке в Realm? Даже если будет только хакерская стратегия, это тоже будет оценено.

+5
источник поделиться
2 ответа

Realm не поддерживает пользовательскую сортировку Results, отличную от того, что дает вам метод Results.sorted(_:ascending:). Но вы можете составить это довольно легко, объединив два запроса, возможно, даже разоблачив это через вычисленное свойство:

var results: [MyModel] {
  let sorted = realm.objects(MyModel).sorted("...", ascending: true)
  return sorted.filter("optionalProperty != nil") +
         sorted.filter("optionalProperty == nil")
}
+4
источник

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

Итак, хотя это не идеально, я решил сохранить свойство hasStartDate: Bool, которое автоматически обновляется вычисленным свойством date: Date? с помощью настраиваемого средства настройки, которое обновляет сохраненные свойства startDate: Date? и hasStartDate. hasStartDate также задается в моих инициализаторах для объекта.

Это позволяет мне использовать:

realm.objects(SMItem.self).filter(predicate).sorted(by: [
    SortDescriptor(keyPath: "hasStartDate", ascending: false),
    SortDescriptor(keyPath: "startDate", ascending: true)
])

Это возвращает объекты с возрастанием startDate, за которым следуют объекты без startDate.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос