在子查询内排序

时间:2017-01-27 07:34:37

标签: ios swift sorting subquery realm

我有两个名为ChatChatMessage的Realm对象。这两者之间存在着一对多的关系。

class Chat: Object {
    dynamic var id: String = ""
    dynamic var createdAt: Date = Date()
    dynamic var creatorId: String = ""
    let chatMessages = List<ChatMessage>()

    override static func primaryKey() -> String? {
        return "id"
    }
}

class ChatMessage: Object {
    dynamic var id: String = ""
    dynamic var chatId: String = ""
    dynamic var createdAt: Date = Date()
    dynamic var read: Bool = false
    dynamic var authorId: String = ""
    dynamic var text: String = ""
    let chat = LinkingObjects(fromType: Chat.self, property: "chatMessages").first

    override static func primaryKey() -> String? {
        return "id"
    }
}

我需要显示一个聊天列表,其中最顶层的消息与最近的消息进行聊天。就像在所有聊天应用中一样为此,我想我需要按链接到每个聊天的Chat对象的createdAt属性值对ChatMessage个对象进行排序。

这就是我现在所拥有的。

func getChats() -> Results<Chat> {
    let realm = try! Realm()
    let chats = realm.objects(Chat.self)
    let predicate = NSPredicate(format: "SUBQUERY(Chat, $chat, $chat.chatMessages)", argumentArray: nil)
    return chats.filter(predicate)
}

我不知道如何对子查询中的chatMessages进行排序。或者,如果可能的话。搜索了Realm文档但无法找到任何内容。任何帮助表示赞赏。或者有任何建议,如果有更好的方法来解决这个问题。

1 个答案:

答案 0 :(得分:1)

filter查询用于隔离特定对象,而不是用于实际排序。因此,尝试在NSPredicate中进行排序并不可行。

现在正在为allowing sorting via to-many child objects在Realm GitHub中跟踪一个问题。从理论上讲,这最终意味着你可以做到:

let chats = realm.objects(Chat.self).sorted(byKeyPath: "chatMessages.createdAt")

我绝对鼓励你在这个问题上添加+1,这样它的优先级就会提升。 :)

与此同时,虽然不是绝对令人惊讶的解决方案,但您可以向Date添加额外的Chat属性,该lastUpdated只复制ChatMessage复制最新日期{{1}对象。这样,您就可以直接对Chat对象进行排序。