diff --git a/ElementX/Sources/Services/Room/RoomProxy.swift b/ElementX/Sources/Services/Room/RoomProxy.swift index 5c27fde2c..096e3a137 100644 --- a/ElementX/Sources/Services/Room/RoomProxy.swift +++ b/ElementX/Sources/Services/Room/RoomProxy.swift @@ -35,11 +35,6 @@ class RoomProxy: RoomProxyProtocol { private(set) var displayName: String? private var backPaginationOutcome: PaginationOutcome? - private(set) lazy var timelineProvider: RoomTimelineProviderProtocol = { - let provider = RoomTimelineProvider(roomProxy: self) - addTimelineListener(listener: WeakRoomTimelineProviderWrapper(timelineProvider: provider)) - return provider - }() deinit { room.removeTimeline() @@ -146,7 +141,7 @@ class RoomProxy: RoomProxyProtocol { } } - private func addTimelineListener(listener: TimelineListener) { + func addTimelineListener(listener: TimelineListener) { room.addTimelineListener(listener: listener) } diff --git a/ElementX/Sources/Services/Room/RoomProxyProtocol.swift b/ElementX/Sources/Services/Room/RoomProxyProtocol.swift index a37708998..48459f6d9 100644 --- a/ElementX/Sources/Services/Room/RoomProxyProtocol.swift +++ b/ElementX/Sources/Services/Room/RoomProxyProtocol.swift @@ -44,8 +44,6 @@ protocol RoomProxyProtocol { var avatarURL: String? { get } - var timelineProvider: RoomTimelineProviderProtocol { get } - func avatarURLStringForUserId(_ userId: String) -> String? func loadAvatarURLForUserId(_ userId: String) async -> Result @@ -56,6 +54,8 @@ protocol RoomProxyProtocol { func loadDisplayName() async -> Result + func addTimelineListener(listener: TimelineListener) + func paginateBackwards(count: UInt) async -> Result func sendMessage(_ message: String, inReplyToEventId: String?) async -> Result diff --git a/ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift b/ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift index 37aa6e1a6..f9daee6cc 100644 --- a/ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift +++ b/ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift @@ -41,6 +41,10 @@ class RoomTimelineProvider: RoomTimelineProviderProtocol { init(roomProxy: RoomProxyProtocol) { self.roomProxy = roomProxy itemProxies = [] + + Task { + await roomProxy.addTimelineListener(listener: WeakRoomTimelineProviderWrapper(timelineProvider: self)) + } } func paginateBackwards(_ count: UInt) async -> Result { diff --git a/ElementX/Sources/UserSession/UserSessionFlowCoordinator.swift b/ElementX/Sources/UserSession/UserSessionFlowCoordinator.swift index ab019ad48..fdc9885ad 100644 --- a/ElementX/Sources/UserSession/UserSessionFlowCoordinator.swift +++ b/ElementX/Sources/UserSession/UserSessionFlowCoordinator.swift @@ -126,10 +126,10 @@ class UserSessionFlowCoordinator: Coordinator { mediaProvider: userSession.mediaProvider, roomProxy: roomProxy, attributedStringBuilder: AttributedStringBuilder()) - + let timelineController = RoomTimelineController(userId: userId, roomId: roomIdentifier, - timelineProvider: roomProxy.timelineProvider, + timelineProvider: RoomTimelineProvider(roomProxy: roomProxy), timelineItemFactory: timelineItemFactory, mediaProvider: userSession.mediaProvider, roomProxy: roomProxy) diff --git a/changelog.d/216.bugfix b/changelog.d/216.bugfix new file mode 100644 index 000000000..7ab2ac06a --- /dev/null +++ b/changelog.d/216.bugfix @@ -0,0 +1 @@ +Fix strong reference cycle between RoomProxy and RoomTimelineProvider \ No newline at end of file