Adopt async uniffi in the RoomSummaryProvider and ensure diffs are still processed serially

This commit is contained in:
Stefan Ceriu
2023-05-16 13:53:27 +03:00
committed by Stefan Ceriu
parent 0d97ed8075
commit d710dafc94
@@ -109,6 +109,19 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
MXLog.info("\(name): Finished applying \(diffs.count) diffs, new room list \(rooms.compactMap { $0.id ?? "Empty" })")
}
// The room summary provider needs to process diffs serially
// Switching to an actor here doesn't help because of all the suspension points
// and actor re-entrance
private static var latestRoomMessage: EventTimelineItem?
private func fetchLastMessage(room: SlidingSyncRoomProtocol) {
let semaphore = DispatchSemaphore(value: 0)
Task {
Self.latestRoomMessage = await room.latestRoomMessage()
semaphore.signal()
}
semaphore.wait()
}
private func buildRoomSummaryForIdentifier(_ identifier: String, invalidated: Bool) -> RoomSummary {
guard let room = try? slidingSyncListProxy.roomForIdentifier(identifier) else {
@@ -119,14 +132,12 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
var attributedLastMessage: AttributedString?
var lastMessageFormattedTimestamp: String?
// Dispatch onto another queue otherwise the rust method latestRoomMessage crashes.
// This will be fixed when we get async uniffi support.
DispatchQueue.global(qos: .userInitiated).sync {
if let latestRoomMessage = room.latestRoomMessage() {
let lastMessage = EventTimelineItemProxy(item: latestRoomMessage)
lastMessageFormattedTimestamp = lastMessage.timestamp.formattedMinimal()
attributedLastMessage = eventStringBuilder.buildAttributedString(for: lastMessage)
}
fetchLastMessage(room: room)
if let latestRoomMessage = Self.latestRoomMessage {
let lastMessage = EventTimelineItemProxy(item: latestRoomMessage)
lastMessageFormattedTimestamp = lastMessage.timestamp.formattedMinimal()
attributedLastMessage = eventStringBuilder.buildAttributedString(for: lastMessage)
}
let fullRoom = room.fullRoom()