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" })") 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 { private func buildRoomSummaryForIdentifier(_ identifier: String, invalidated: Bool) -> RoomSummary {
guard let room = try? slidingSyncListProxy.roomForIdentifier(identifier) else { guard let room = try? slidingSyncListProxy.roomForIdentifier(identifier) else {
@@ -119,14 +132,12 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
var attributedLastMessage: AttributedString? var attributedLastMessage: AttributedString?
var lastMessageFormattedTimestamp: String? var lastMessageFormattedTimestamp: String?
// Dispatch onto another queue otherwise the rust method latestRoomMessage crashes. fetchLastMessage(room: room)
// This will be fixed when we get async uniffi support.
DispatchQueue.global(qos: .userInitiated).sync { if let latestRoomMessage = Self.latestRoomMessage {
if let latestRoomMessage = room.latestRoomMessage() { let lastMessage = EventTimelineItemProxy(item: latestRoomMessage)
let lastMessage = EventTimelineItemProxy(item: latestRoomMessage) lastMessageFormattedTimestamp = lastMessage.timestamp.formattedMinimal()
lastMessageFormattedTimestamp = lastMessage.timestamp.formattedMinimal() attributedLastMessage = eventStringBuilder.buildAttributedString(for: lastMessage)
attributedLastMessage = eventStringBuilder.buildAttributedString(for: lastMessage)
}
} }
let fullRoom = room.fullRoom() let fullRoom = room.fullRoom()