2017-06-25 21 views
1

列表里面所以,我有以下对象境界订单对象日期

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)但引发以下错误

终止应用程序由于未捕获的异常“的排序无效的关键路径”, 原因:“不能排序上” messages.date':不支持排序 包含多对多关键的关键路径。'

我目前无法弄清楚如何解决这个问题。有人知道我如何才能实现正确的排序行为吗?

+0

你会得到什么错误?初看起来,如果chatResults是Chat类型的话,它看起来就像一个错字。 'messages'没有'date'属性,因为它是一个列表而不是一个'Message'对象。 –

+0

@DávidPásztor我更新了答案,包括它抛出的错误 – NoSixties

回答

1

您正尝试访问列表上单个实例的属性,特别是您试图根据单个Message实例的属性对List<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 
} 

的代码已经在操场上进行了测试,并返回其最新Message按照从大到小的顺序日期排序您RealmChat实例。

+0

我写了类似的东西,现在唯一的问题是它会返回一个聊天数组。我其实想要订购'Result'列表本身。你有什么想法如何做到这一点? – NoSixties

+0

就我而言,Realm的'sorted'函数不支持通过闭包进行排序,所以这是不可能的。但是,除非出于某种原因,您需要公开“结果”的自我更新性质,否则我没有看到为什么'Array'不适合。 –

+0

假设我将一个'lastMessageDate'对象添加到聊天类。然后,我可以使用'let chatResults:Result = realm.objects(Chat.self).sorted(byKeyPath:“lastMessageDate”,升序:false)'没有任何问题 – NoSixties