Prevent race conditions when adding timeline listeners between the timeline provider and other screens

This commit is contained in:
Stefan Ceriu
2023-05-26 17:34:20 +03:00
committed by Stefan Ceriu
parent 0082aba9d4
commit 142a8d6275
4 changed files with 24 additions and 23 deletions
@@ -39,24 +39,22 @@ class RoomTimelineProvider: RoomTimelineProviderProtocol {
self.roomProxy = roomProxy
serialDispatchQueue = DispatchQueue(label: "io.element.elementx.roomtimelineprovider", qos: .utility)
itemProxies = []
Task { @MainActor in
roomProxy
.updatesPublisher
.collect(.byTime(serialDispatchQueue, 0.1))
.sink { [weak self] in self?.updateItemsWithDiffs($0) }
.store(in: &cancellables)
switch roomProxy.registerTimelineListenerIfNeeded() {
case let .success(items):
itemProxies = items.map(TimelineItemProxy.init)
MXLog.info("Added timeline listener, current items (\(items.count)) : \(items.map(\.debugIdentifier))")
case .failure(.roomListenerAlreadyRegistered):
MXLog.info("Listener already registered for the room: \(roomProxy.id)")
case .failure:
let roomID = roomProxy.id
MXLog.error("Failed adding timeline listener on room with identifier: \(roomID)")
}
roomProxy
.updatesPublisher
.collect(.byTime(serialDispatchQueue, 0.1))
.sink { [weak self] in self?.updateItemsWithDiffs($0) }
.store(in: &cancellables)
switch roomProxy.registerTimelineListenerIfNeeded() {
case let .success(items):
itemProxies = items.map(TimelineItemProxy.init)
MXLog.info("Added timeline listener, current items (\(items.count)) : \(items.map(\.debugIdentifier))")
case .failure(.roomListenerAlreadyRegistered):
MXLog.info("Listener already registered for the room: \(roomProxy.id)")
case .failure:
let roomID = roomProxy.id
MXLog.error("Failed adding timeline listener on room with identifier: \(roomID)")
}
}
@@ -17,6 +17,7 @@
import Combine
import Foundation
@MainActor
protocol RoomTimelineProviderProtocol {
var itemsPublisher: CurrentValuePublisher<[TimelineItemProxy], Never> { get }
}