swift - Realm 按日期列表内的日期对对象进行排序

标签 swift realm

所以我有以下对象

class Chat: Object {
    dynamic var chatID = ""
    var participants = List<Friend>()
    var messages = List<Message>()

    /// Set the primary key
    override static func primaryKey() -> String? {
        return "chatID"
    }
}

class Message: Object {
    dynamic var chat: Chat!
    dynamic var from: Friend!
    dynamic var message = ""
    dynamic var date = Date()
    dynamic var isRead: Bool = false
}

现在我获得了所有已创建的聊天的列表。当我进行聊天时,我希望能够根据最后一条消息对它们进行排序。所以我需要做的是按消息列表中的日期对聊天列表进行排序。

包含最新日期消息的聊天需要位于顶部,依此类推。

我尝试按如下方式对列表进行排序 realmManager.chatResults.sorted(byKeyPath: "messages.date", ascending: false) 但这会引发以下错误

Terminating app due to uncaught exception 'Invalid key path for sort', reason: 'Cannot sort on 'messages.date': sorting on key paths that include a to-many relationship is not supported.'

我目前不知道如何解决这个问题。有人知道我如何实现正确的排序行为吗?

最佳答案

您正在尝试访问列表中单个实例的属性,特别是您正在尝试对 List<Message> 进行排序基于单个属性的集合Message实例。

如果你想排序Chat实例,首先你必须排序 Chat.messages然后按最后一条消息排序。为了减轻这个错误,你可以使用 Swift 的内置 sorted与 Realm 一起发挥作用。

let sortedChats = realm.objects(Chat.self).sorted{
    guard let currentLatestDate = $0.messages.sorted(byKeyPath: "date",ascending: false).first?.date, let nextLatestDate = $1.messages.sorted(byKeyPath: "date",ascending: false).first?.date else {return false}
    return currentLatestDate > nextLatestDate
}

该代码已在 Playground 中进行了测试,并返回 Chat您的 Realm 的实例按最新日期排序 Message按降序排列。

关于swift - Realm 按日期列表内的日期对对象进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44749579/

相关文章:

Swift3.0 中的 Realm 意外状态代码 : -34018

android - 如何管理 Realm 实例?

ios - UNNotificationServiceExtension 偶尔更新通知失败

ios - IPv6 - Apple 拒绝 iOS 应用程序,因为不支持 IPv6 DNS64/NAT64 网络

swift - 在 Swift 中一次迭代两个集合

ios - 如何使用Webview点击并下载文件

Swift Realm 对象和可映射

react-native - 如何为 React Native 应用程序创建 Realm DB?

swift - 在 RealmSwift 0.92.3 上实例化 RLMObject

ios - 使用 Swift 从 for 循环中查找 Firebase 键的 nil