Ios 子查询内的排序
我有两个领域对象称为Ios 子查询内的排序,ios,swift,sorting,subquery,realm,Ios,Swift,Sorting,Subquery,Realm,我有两个领域对象称为Chat和ChatMessage。两者之间存在一对多的关系 class Chat: Object { dynamic var id: String = "" dynamic var createdAt: Date = Date() dynamic var creatorId: String = "" let chatMessages = List<ChatMessage>() override static func pr
Chat
和ChatMessage
。两者之间存在一对多的关系
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"
}
}
我不知道如何对子查询中的
chatMessages
进行排序。如果可能的话。搜索了领域文档,但找不到任何内容。感谢您的帮助。如果有更好的方法,也可以提供任何建议。过滤器查询用于隔离特定对象,而不是实际对它们进行排序。因此,尝试在NSPredicate
中进行排序实际上是不可行的
GitHub领域目前正在跟踪一个问题。这在理论上最终意味着你可以简单地做到:
let chats=realm.objects(Chat.self).排序(按KeyPath:“chatMessages.createdAt”)
我绝对鼓励您将+1添加到该问题中,以便提高其优先级。:)
与此同时,虽然不是一个绝对令人惊奇的解决方案,但您可以向
聊天
添加一个附加的日期
属性,该属性只是最新更新的
,用于复制最新的聊天消息
对象的日期。这样你就可以直接用它对聊天对象进行排序。谢谢你的回复。是的,我已经遇到了Github的问题,并对其进行了投票:)我想我会采用建议的解决方案。顺便问一下,域中是否有一种方法可以使Chat
中新添加的Date
属性在添加新的ChatMessage
对象时自动更新?还是我必须手动设置?@Isuru我很乐意!酷!谢谢你!六羟甲基三聚氰胺六甲醚。。。每当更新chatMessages
属性时,您可以使用领域通知系统触发警报,但这可能有点笨拙。最简单的方法可能是为名为addMessage()
的Chat
添加一个方便的方法,该方法既可以将新消息添加到列表中,也可以更新lastUpdated
属性:@TiM参加聚会迟到了,但在尝试通过LinkingObjects/hasManyDate
属性进行排序时才意识到这是不可能的,当它出现在我的关键路径上时,我感到惊讶。在父级上使用这种类型的“缓存列”仍然是最好的路由吗?当然,这听起来比我看到的很多例子都要好,比如人们指责和强迫返回数组,这会破坏整个PointOrry@RyanRomanchuk,我不再在Realm工作了,我也没有跟上它的最新改进,所以我真的不知道。我链接的那个问题自2017年以来就没有更新过,所以我最好的猜测是答案是“是的,这可能仍然是最好的方式”。如果您想要更正式的答案,最好在GitHub问题或领域支持论坛上提问。祝你好运
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)
}