【发布时间】:2019-07-08 16:14:32
【问题描述】:
我在我的 Swift iOS 应用程序中使用 Realm,并且我有一个模型,我正在尝试向其中添加计算属性。下面是这个类的样子:
class Conversation: Object {
@objc dynamic var conversationId: String = generateConversationId()
@objc dynamic var createdTime = Date()
@objc dynamic var title: String = ""
let messages = List<Message>()
var lastUpdated: Date {
if let newestMessage = self.messages.sorted(byKeyPath: "timestamp", ascending: false).first {
return newestMessage.timestamp
} else {
return Date(timeIntervalSince1970: 0)
}
}
}
如您所见,此对象表示一个会话,该会话具有多个属性,其中一个是属于该会话的消息列表。我添加的计算属性 (lastUpdated) 应该只返回 messages 列表中最新消息的时间戳,或者,当列表为空时,它将返回默认日期值。
在我的一个视图控制器中,我正在创建一个结果集合来访问 Conversation 对象,如下所示:
var conversations: Results<Conversation> = realm.objects(Conversation.self)
这可行,我可以按预期访问每个 Conversation 上的 lastUpdated 属性。但是,我想让这个集合按lastUpdated 属性排序,所以我尝试像这样修改我的结果集合:
var conversations: Results<Conversation> = realm.objects(Conversation.self).sorted(byKeyPath: "lastUpdated", ascending: true)
当我这样做时,应用程序会抛出以下异常:
Terminating app due to uncaught exception 'RLMException', reason: 'Cannot sort on key path 'lastUpdated': property 'Conversation.lastUpdated' does not exist.'
我认为这可能会发生,因为 lastUpdated 计算属性未保留在 Conversation 对象上(我将使用 Realm Studio 快速验证这一点,但我的 Realm 已加密)。我没有明确地忽略这个属性,但我认为是这种情况,因为lastUpdated 不像我的所有其他属性那样用@objc dynamic 装饰。我尝试添加它,擦除我的应用安装,重新编译并再次测试,但我仍然遇到同样的异常。
也许不可能持久化一个计算属性(因为,嗯,它是计算出来的!)但是有没有其他方法可以指定我的对话结果集合应该按这个属性排序?
【问题讨论】:
标签: ios swift realm computed-properties