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
@@ -186,13 +186,14 @@ class RoomProxy: RoomProxyProtocol {
timelineLimit: UInt32(SlidingSyncConstants.timelinePrecachingTimelineLimit))
roomSubscriptionObservationToken = slidingSyncRoom.subscribeToRoom(settings: settings)
let listener = RoomTimelineListener { [weak self] timelineDiff in
let timelineListener = RoomTimelineListener { [weak self] timelineDiff in
self?.updatesSubject.send(timelineDiff)
}
if let result = try? slidingSyncRoom.addTimelineListener(listener: listener) {
self.timelineListener = timelineListener
if let result = try? slidingSyncRoom.addTimelineListener(listener: timelineListener) {
roomTimelineObservationToken = result.taskHandle
timelineListener = listener
Task {
await fetchMembers()
@@ -200,6 +201,7 @@ class RoomProxy: RoomProxyProtocol {
}
return .success(result.items)
} else {
self.timelineListener = nil
return .failure(.failedAddingTimelineListener)
}
}
@@ -40,7 +40,6 @@ class RoomTimelineProvider: RoomTimelineProviderProtocol {
serialDispatchQueue = DispatchQueue(label: "io.element.elementx.roomtimelineprovider", qos: .utility)
itemProxies = []
Task { @MainActor in
roomProxy
.updatesPublisher
.collect(.byTime(serialDispatchQueue, 0.1))
@@ -58,7 +57,6 @@ class RoomTimelineProvider: RoomTimelineProviderProtocol {
MXLog.error("Failed adding timeline listener on room with identifier: \(roomID)")
}
}
}
// MARK: - Private
@@ -17,6 +17,7 @@
import Combine
import Foundation
@MainActor
protocol RoomTimelineProviderProtocol {
var itemsPublisher: CurrentValuePublisher<[TimelineItemProxy], Never> { get }
}
@@ -491,7 +491,7 @@ class MockScreen: Identifiable {
let mockUserSession = MockUserSession(clientProxy: clientProxy, mediaProvider: MockMediaProvider())
let createRoomParameters = CreateRoomFlowParameters()
let selectedUsers: [UserProfile] = [.mockAlice, .mockBob, .mockCharlie]
let parameters = CreateRoomCoordinatorParameters(userSession: mockUserSession, userIndicatorController: MockUserIndicatorController(), createRoomParameters: .init(createRoomParameters), selectedUsers: .init(selectedUsers))
let parameters = CreateRoomCoordinatorParameters(userSession: mockUserSession, userIndicatorController: nil, createRoomParameters: .init(createRoomParameters), selectedUsers: .init(selectedUsers))
let coordinator = CreateRoomCoordinator(parameters: parameters)
navigationStackCoordinator.setRootCoordinator(coordinator)
return navigationStackCoordinator
@@ -500,7 +500,7 @@ class MockScreen: Identifiable {
let clientProxy = MockClientProxy(userID: "@mock:client.com")
let mockUserSession = MockUserSession(clientProxy: clientProxy, mediaProvider: MockMediaProvider())
let createRoomParameters = CreateRoomFlowParameters()
let parameters = CreateRoomCoordinatorParameters(userSession: mockUserSession, userIndicatorController: MockUserIndicatorController(), createRoomParameters: .init(createRoomParameters), selectedUsers: .init([]))
let parameters = CreateRoomCoordinatorParameters(userSession: mockUserSession, userIndicatorController: nil, createRoomParameters: .init(createRoomParameters), selectedUsers: .init([]))
let coordinator = CreateRoomCoordinator(parameters: parameters)
navigationStackCoordinator.setRootCoordinator(coordinator)
return navigationStackCoordinator