From 616b8453b5806b82629fbb2c6ad1b0ec3a3166d4 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Wed, 19 Apr 2023 15:59:28 +0300 Subject: [PATCH] Fixes #785 - Speed up restoring the room list from the cold cache --- .../Sources/Services/Client/ClientProxy.swift | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/ElementX/Sources/Services/Client/ClientProxy.swift b/ElementX/Sources/Services/Client/ClientProxy.swift index a823a42f1..e5ca81c66 100644 --- a/ElementX/Sources/Services/Client/ClientProxy.swift +++ b/ElementX/Sources/Services/Client/ClientProxy.swift @@ -327,6 +327,10 @@ class ClientProxy: ClientProxyProtocol { allRoomsViewProxy?.setSlidingSync(slidingSync: slidingSync) invitesViewProxy?.setSlidingSync(slidingSync: slidingSync) + // Build the room summary providers later so the sliding sync view proxies are up to date and the + // currentRoomList is populate with the data from the cold cache + buildRoomSummaryProviders() + slidingSync.setObserver(observer: WeakClientProxyWrapper(clientProxy: self)) self.slidingSync = slidingSync @@ -352,9 +356,6 @@ class ClientProxy: ClientProxyProtocol { let visibleRoomsViewProxy = SlidingSyncViewProxy(slidingSyncView: visibleRoomsSlidingSyncView, name: "Visible rooms") - visibleRoomsSummaryProvider = RoomSummaryProvider(slidingSyncViewProxy: visibleRoomsViewProxy, - eventStringBuilder: RoomEventStringBuilder(stateEventStringBuilder: RoomStateEventStringBuilder(userID: userID))) - self.visibleRoomsSlidingSyncView = visibleRoomsSlidingSyncView self.visibleRoomsViewProxy = visibleRoomsViewProxy @@ -394,13 +395,8 @@ class ClientProxy: ClientProxyProtocol { .batchSize(batchSize: 100) .build() - let allRoomsViewProxy = SlidingSyncViewProxy(slidingSyncView: allRoomsSlidingSyncView, name: "All rooms") - - allRoomsSummaryProvider = RoomSummaryProvider(slidingSyncViewProxy: allRoomsViewProxy, - eventStringBuilder: RoomEventStringBuilder(stateEventStringBuilder: RoomStateEventStringBuilder(userID: userID))) - self.allRoomsSlidingSyncView = allRoomsSlidingSyncView - self.allRoomsViewProxy = allRoomsViewProxy + allRoomsViewProxy = SlidingSyncViewProxy(slidingSyncView: allRoomsSlidingSyncView, name: "All rooms") } catch { MXLog.error("Failed building the all rooms sliding sync view with error: \(error)") @@ -422,18 +418,33 @@ class ClientProxy: ClientProxyProtocol { .batchSize(batchSize: 100) .build() - let invitesViewProxy = SlidingSyncViewProxy(slidingSyncView: invitesView, name: "Invites") - - invitesSummaryProvider = RoomSummaryProvider(slidingSyncViewProxy: invitesViewProxy, - eventStringBuilder: RoomEventStringBuilder(stateEventStringBuilder: RoomStateEventStringBuilder(userID: userID))) - invitesSlidingSyncView = invitesView - self.invitesViewProxy = invitesViewProxy + invitesViewProxy = SlidingSyncViewProxy(slidingSyncView: invitesView, name: "Invites") } catch { MXLog.error("Failed building the invites sliding sync view with error: \(error)") } } + private func buildRoomSummaryProviders() { + guard visibleRoomsSummaryProvider == nil, allRoomsSummaryProvider == nil, invitesSummaryProvider == nil else { + fatalError("This shouldn't be called more than once") + } + + guard let visibleRoomsViewProxy, let allRoomsViewProxy, let invitesViewProxy else { + MXLog.error("Sliding sync view proxies unavailable") + return + } + + visibleRoomsSummaryProvider = RoomSummaryProvider(slidingSyncViewProxy: visibleRoomsViewProxy, + eventStringBuilder: RoomEventStringBuilder(stateEventStringBuilder: RoomStateEventStringBuilder(userID: userID))) + + allRoomsSummaryProvider = RoomSummaryProvider(slidingSyncViewProxy: allRoomsViewProxy, + eventStringBuilder: RoomEventStringBuilder(stateEventStringBuilder: RoomStateEventStringBuilder(userID: userID))) + + invitesSummaryProvider = RoomSummaryProvider(slidingSyncViewProxy: invitesViewProxy, + eventStringBuilder: RoomEventStringBuilder(stateEventStringBuilder: RoomStateEventStringBuilder(userID: userID))) + } + private lazy var slidingSyncRequiredState = [RequiredState(key: "m.room.avatar", value: ""), RequiredState(key: "m.room.encryption", value: "")]