From d3b21e745ff101bb383658ad8732c44346909511 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Tue, 19 Sep 2023 09:03:25 +0300 Subject: [PATCH] Avoid too much back and forth throuhg FFI by lazily fetching and storing timeline item properties --- .../Services/Timeline/TimelineItemProxy.swift | 42 +++++++------------ 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/ElementX/Sources/Services/Timeline/TimelineItemProxy.swift b/ElementX/Sources/Services/Timeline/TimelineItemProxy.swift index 3501b62ed..aa1664632 100644 --- a/ElementX/Sources/Services/Timeline/TimelineItemProxy.swift +++ b/ElementX/Sources/Services/Timeline/TimelineItemProxy.swift @@ -63,7 +63,7 @@ enum TimelineItemDeliveryStatus: Hashable { } /// A light wrapper around event timeline items returned from Rust. -struct EventTimelineItemProxy { +class EventTimelineItemProxy { let item: MatrixRustSDK.EventTimelineItem let id: TimelineItemIdentifier @@ -72,7 +72,7 @@ struct EventTimelineItemProxy { self.id = TimelineItemIdentifier(timelineID: String(id), eventID: item.eventId(), transactionID: item.transactionId()) } - var deliveryStatus: TimelineItemDeliveryStatus? { + lazy var deliveryStatus: TimelineItemDeliveryStatus? = { guard let localSendState = item.localSendState() else { return nil } @@ -86,25 +86,17 @@ struct EventTimelineItemProxy { case .sent: return .sent } - } + }() - var isRoomState: Bool { - content.kind().isRoomState - } + lazy var isRoomState = content.kind().isRoomState - var content: TimelineItemContent { - item.content() - } + lazy var content = item.content() - var isOwn: Bool { - item.isOwn() - } + lazy var isOwn = item.isOwn() - var isEditable: Bool { - item.isEditable() - } + lazy var isEditable = item.isEditable() - var sender: TimelineItemSender { + lazy var sender: TimelineItemSender = { let profile = item.senderProfile() switch profile { @@ -117,24 +109,18 @@ struct EventTimelineItemProxy { displayName: nil, avatarURL: nil) } - } + }() - var reactions: [Reaction] { - item.reactions() - } + lazy var reactions = item.reactions() - var timestamp: Date { - Date(timeIntervalSince1970: TimeInterval(item.timestamp() / 1000)) - } + lazy var timestamp = Date(timeIntervalSince1970: TimeInterval(item.timestamp() / 1000)) - var debugInfo: TimelineItemDebugInfo { + lazy var debugInfo: TimelineItemDebugInfo = { let debugInfo = item.debugInfo() return TimelineItemDebugInfo(model: debugInfo.model, originalJSON: debugInfo.originalJson, latestEditJSON: debugInfo.latestEditJson) - } + }() - var readReceipts: [String: Receipt] { - item.readReceipts() - } + lazy var readReceipts = item.readReceipts() } extension TimelineItemContentKind {