mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 16:10:20 +00:00
Move the RoomSummaryProvider id based room updated to the same serial dispatch queue as the normal diffing. Cleanup logging and RoomTimelineProvider diffing
This commit is contained in:
committed by
Stefan Ceriu
parent
3d06190b13
commit
95137c0f7a
@@ -62,7 +62,28 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func updateRoomsWithIdentifiers(_ identifiers: [String]) {
|
func updateRoomsWithIdentifiers(_ identifiers: [String]) {
|
||||||
|
serialDispatchQueue.async { [weak self] in
|
||||||
|
guard let self else { return }
|
||||||
|
self.updateRoomsForIdentifiers(identifiers)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateVisibleRange(_ range: ClosedRange<Int>) {
|
||||||
|
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 {
|
guard statePublisher.value == .live else {
|
||||||
|
MXLog.verbose("Sliding sync not live yet, ignoring.")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,16 +112,12 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
rooms = newSummaries
|
rooms = newSummaries
|
||||||
|
|
||||||
|
MXLog.verbose("Finished updating \(identifiers.count) rooms")
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateVisibleRange(_ range: ClosedRange<Int>) {
|
|
||||||
slidingSyncViewProxy.updateVisibleRange(range)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Private
|
|
||||||
|
|
||||||
fileprivate func updateRoomsWithDiffs(_ diffs: [SlidingSyncViewRoomsListDiff]) {
|
fileprivate func updateRoomsWithDiffs(_ diffs: [SlidingSyncViewRoomsListDiff]) {
|
||||||
MXLog.info("Received \(diffs.count) diffs")
|
MXLog.verbose("Received \(diffs.count) diffs")
|
||||||
|
|
||||||
rooms = diffs
|
rooms = diffs
|
||||||
.reduce(rooms) { currentItems, diff in
|
.reduce(rooms) { currentItems, diff in
|
||||||
@@ -119,7 +136,7 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
|
|||||||
return updatedItems
|
return updatedItems
|
||||||
}
|
}
|
||||||
|
|
||||||
MXLog.info("Finished applying diffs")
|
MXLog.verbose("Finished applying \(diffs.count) diffs")
|
||||||
}
|
}
|
||||||
|
|
||||||
private func buildRoomSummaryForIdentifier(_ identifier: String, invalidated: Bool) -> RoomSummary {
|
private func buildRoomSummaryForIdentifier(_ identifier: String, invalidated: Bool) -> RoomSummary {
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ private class RoomTimelineListener: TimelineListener {
|
|||||||
|
|
||||||
class RoomTimelineProvider: RoomTimelineProviderProtocol {
|
class RoomTimelineProvider: RoomTimelineProviderProtocol {
|
||||||
private let roomProxy: RoomProxyProtocol
|
private let roomProxy: RoomProxyProtocol
|
||||||
private let serialDispatchQueue: DispatchQueue
|
|
||||||
private var cancellables = Set<AnyCancellable>()
|
private var cancellables = Set<AnyCancellable>()
|
||||||
|
|
||||||
let itemsPublisher = CurrentValueSubject<[TimelineItemProxy], Never>([])
|
let itemsPublisher = CurrentValueSubject<[TimelineItemProxy], Never>([])
|
||||||
@@ -41,7 +40,6 @@ class RoomTimelineProvider: RoomTimelineProviderProtocol {
|
|||||||
|
|
||||||
init(roomProxy: RoomProxyProtocol) {
|
init(roomProxy: RoomProxyProtocol) {
|
||||||
self.roomProxy = roomProxy
|
self.roomProxy = roomProxy
|
||||||
serialDispatchQueue = DispatchQueue(label: "io.element.elementx.roomtimelineprovider")
|
|
||||||
itemProxies = []
|
itemProxies = []
|
||||||
|
|
||||||
Task {
|
Task {
|
||||||
@@ -50,8 +48,7 @@ class RoomTimelineProvider: RoomTimelineProviderProtocol {
|
|||||||
roomTimelineListener
|
roomTimelineListener
|
||||||
.itemsUpdatePublisher
|
.itemsUpdatePublisher
|
||||||
.receive(on: DispatchQueue.main)
|
.receive(on: DispatchQueue.main)
|
||||||
// .collect(.byTime(serialDispatchQueue, 0.25))
|
.sink { [weak self] in self?.updateItemsWithDiff($0) }
|
||||||
.sink { [weak self] in self?.updateItemsWithDiffs([$0]) }
|
|
||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
|
|
||||||
switch await roomProxy.addTimelineListener(listener: roomTimelineListener) {
|
switch await roomProxy.addTimelineListener(listener: roomTimelineListener) {
|
||||||
@@ -138,27 +135,24 @@ class RoomTimelineProvider: RoomTimelineProviderProtocol {
|
|||||||
|
|
||||||
// MARK: - Private
|
// MARK: - Private
|
||||||
|
|
||||||
private func updateItemsWithDiffs(_ diffs: [TimelineDiff]) {
|
private func updateItemsWithDiff(_ diff: TimelineDiff) {
|
||||||
MXLog.verbose("Received timeline diffs")
|
MXLog.verbose("Received timeline diff")
|
||||||
|
|
||||||
itemProxies = diffs
|
guard let collectionDiff = buildDiff(from: diff, on: itemProxies) else {
|
||||||
.reduce(itemProxies) { currentItems, diff in
|
MXLog.error("Failed building CollectionDifference from \(diff)")
|
||||||
guard let collectionDiff = buildDiff(from: diff, on: currentItems) else {
|
return
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
// swiftlint:disable:next cyclomatic_complexity function_body_length
|
||||||
|
|||||||
Reference in New Issue
Block a user