Сбор результатов сортировки Realm по вычисляемой собственности - PullRequest
0 голосов
/ 14 февраля 2019

Я использую Realm в своем приложении Swift для iOS, и у меня есть модель, к которой я пытаюсь добавить вычисляемое свойство.Вот как выглядит класс:

class Conversation: Object {

    @objc dynamic var conversationId: String = generateConversationId()
    @objc dynamic var createdTime = Date()
    @objc dynamic var title: String = ""
    let messages = List<Message>()

    var lastUpdated: Date {
        if let newestMessage = self.messages.sorted(byKeyPath: "timestamp", ascending: false).first {
            return newestMessage.timestamp
        } else {
            return Date(timeIntervalSince1970: 0)
        }
    }        
}

Как видите, этот объект представляет собой беседу, которая имеет несколько свойств, одним из которых является список сообщений, принадлежащих беседе.Добавленное мной вычисляемое свойство (lastUpdated) должно просто возвращать метку времени самого последнего сообщения в списке messages или, если список пуст, возвращать значение даты по умолчанию.

В одном из моих контроллеров представления я создаю коллекцию результатов для доступа к Conversation объектам, подобным этому:

var conversations: Results<Conversation> = realm.objects(Conversation.self)

Это работает, и я могу получить доступ к свойству lastUpdated в каждом Conversationкак и ожидалось.Однако я хотел бы отсортировать эту коллекцию по свойству lastUpdated, поэтому я попытался изменить свою коллекцию результатов следующим образом:

var conversations: Results<Conversation> = realm.objects(Conversation.self).sorted(byKeyPath: "lastUpdated", ascending: true)

При этом приложение выдает следующее исключение:

Terminating app due to uncaught exception 'RLMException', reason: 'Cannot sort on key path 'lastUpdated': property 'Conversation.lastUpdated' does not exist.'

Я думаю это может происходить, потому что вычисляемое свойство lastUpdated не сохраняется на объекте Conversation (я бы использовал Realm Studio, чтобы быстро это проверить, но моя Областьзашифрованы).Я явно не игнорирую это свойство, но предполагаю, что это так, потому что lastUpdated не украшен @objc dynamic, как и все мои другие свойства.Я попытался добавить это, стереть мою установку приложения, перекомпилировать и протестировать снова, но я все равно получаю то же исключение.

Возможно, невозможно сохранить вычисляемое свойство (потому что, ну, оно вычислено!), НоЕсть ли другой способ указать, что моя коллекция результатов беседы должна сортироваться по этому свойству?

1 Ответ

0 голосов
/ 14 февраля 2019

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

Однако существует обходной путь, если вам не требуется автоматическое обновление природыResults.Вы можете использовать метод Swift sorted, который принимает замыкание в качестве параметра сортировки, что приводит к возвращаемому значению типа [Conversation]:

let conversations = realm.objects(Conversation.self).sorted(by: {$0.lastUpdated < $1.lastUpdated})
...