所以我有以下对象
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/