From 95137c0f7a6de7deaa1f0e1439767e16699d3ec0 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Wed, 11 Jan 2023 16:55:20 +0200 Subject: [PATCH] Move the RoomSummaryProvider id based room updated to the same serial dispatch queue as the normal diffing. Cleanup logging and RoomTimelineProvider diffing --- .../RoomSummary/RoomSummaryProvider.swift | 33 +++++++++++---- .../Timeline/RoomTimelineProvider.swift | 40 ++++++++----------- 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift b/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift index 938f1a206..b6b58a077 100644 --- a/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift +++ b/ElementX/Sources/Services/Room/RoomSummary/RoomSummaryProvider.swift @@ -62,7 +62,28 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol { } func updateRoomsWithIdentifiers(_ identifiers: [String]) { + serialDispatchQueue.async { [weak self] in + guard let self else { return } + self.updateRoomsForIdentifiers(identifiers) + } + } + + func updateVisibleRange(_ range: ClosedRange) { + slidingSyncViewProxy.updateVisibleRange(range) + } + + // MARK: - Private + + /// Invoked from `updateRoomsWithIdentifiers` on the same dispatch queue as `updateRoomsWithDiffs` + private func updateRoomsForIdentifiers(_ identifiers: [String]) { + guard !identifiers.isEmpty else { + return + } + + MXLog.verbose("Updating \(identifiers.count) rooms") + guard statePublisher.value == .live else { + MXLog.verbose("Sliding sync not live yet, ignoring.") return } @@ -91,16 +112,12 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol { } rooms = newSummaries + + MXLog.verbose("Finished updating \(identifiers.count) rooms") } - func updateVisibleRange(_ range: ClosedRange) { - slidingSyncViewProxy.updateVisibleRange(range) - } - - // MARK: - Private - fileprivate func updateRoomsWithDiffs(_ diffs: [SlidingSyncViewRoomsListDiff]) { - MXLog.info("Received \(diffs.count) diffs") + MXLog.verbose("Received \(diffs.count) diffs") rooms = diffs .reduce(rooms) { currentItems, diff in @@ -119,7 +136,7 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol { return updatedItems } - MXLog.info("Finished applying diffs") + MXLog.verbose("Finished applying \(diffs.count) diffs") } private func buildRoomSummaryForIdentifier(_ identifier: String, invalidated: Bool) -> RoomSummary { diff --git a/ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift b/ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift index 95442b111..39de063ca 100644 --- a/ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift +++ b/ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift @@ -28,7 +28,6 @@ private class RoomTimelineListener: TimelineListener { class RoomTimelineProvider: RoomTimelineProviderProtocol { private let roomProxy: RoomProxyProtocol - private let serialDispatchQueue: DispatchQueue private var cancellables = Set() let itemsPublisher = CurrentValueSubject<[TimelineItemProxy], Never>([]) @@ -41,7 +40,6 @@ class RoomTimelineProvider: RoomTimelineProviderProtocol { init(roomProxy: RoomProxyProtocol) { self.roomProxy = roomProxy - serialDispatchQueue = DispatchQueue(label: "io.element.elementx.roomtimelineprovider") itemProxies = [] Task { @@ -50,8 +48,7 @@ class RoomTimelineProvider: RoomTimelineProviderProtocol { roomTimelineListener .itemsUpdatePublisher .receive(on: DispatchQueue.main) -// .collect(.byTime(serialDispatchQueue, 0.25)) - .sink { [weak self] in self?.updateItemsWithDiffs([$0]) } + .sink { [weak self] in self?.updateItemsWithDiff($0) } .store(in: &cancellables) switch await roomProxy.addTimelineListener(listener: roomTimelineListener) { @@ -138,27 +135,24 @@ class RoomTimelineProvider: RoomTimelineProviderProtocol { // MARK: - Private - private func updateItemsWithDiffs(_ diffs: [TimelineDiff]) { - MXLog.verbose("Received timeline diffs") + private func updateItemsWithDiff(_ diff: TimelineDiff) { + MXLog.verbose("Received timeline diff") - itemProxies = diffs - .reduce(itemProxies) { currentItems, diff in - guard let collectionDiff = buildDiff(from: diff, on: currentItems) else { - MXLog.error("Failed building CollectionDifference from \(diff)") - return currentItems - } - - guard let updatedItems = currentItems.applying(collectionDiff) else { - MXLog.error("Failed applying diff: \(collectionDiff)") - return currentItems - } - - MXLog.verbose("Applied diff \(collectionDiff), new count: \(updatedItems.count)") - - return updatedItems - } + guard let collectionDiff = buildDiff(from: diff, on: itemProxies) else { + MXLog.error("Failed building CollectionDifference from \(diff)") + return + } - MXLog.verbose("Finished applying diffs") + guard let updatedItems = itemProxies.applying(collectionDiff) else { + MXLog.error("Failed applying diff: \(collectionDiff)") + return + } + + MXLog.verbose("Applied diff \(collectionDiff), new count: \(updatedItems.count)") + + itemProxies = updatedItems + + MXLog.verbose("Finished applying diff") } // swiftlint:disable:next cyclomatic_complexity function_body_length