mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-02 12:07:55 +00:00
Adopt async uniffi in the RoomSummaryProvider and ensure diffs are still processed serially
This commit is contained in:
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()
|
||||
|
||||
Reference in New Issue
Block a user