From 28f6f68422867f70e58b35ea520c1fe2c513d9ab Mon Sep 17 00:00:00 2001 From: viktorstrate Date: Mon, 22 Jun 2026 12:01:09 +0200 Subject: [PATCH] Remove ._throttle() as it would make some updates stale --- Mactrix/Models/LiveRoomSearch.swift | 7 +------ Mactrix/Models/LiveSpaceRoomList.swift | 11 +++-------- Mactrix/Models/LiveSpaceService.swift | 7 +------ Mactrix/Models/LiveTimeline.swift | 7 +------ Mactrix/Models/MatrixClient.swift | 17 ++++++----------- Mactrix/Models/SidebarRoom.swift | 4 ++-- 6 files changed, 14 insertions(+), 39 deletions(-) diff --git a/Mactrix/Models/LiveRoomSearch.swift b/Mactrix/Models/LiveRoomSearch.swift index 498647c..bae431c 100644 --- a/Mactrix/Models/LiveRoomSearch.swift +++ b/Mactrix/Models/LiveRoomSearch.swift @@ -27,12 +27,7 @@ class LiveRoomSearch { resultsHandle = await roomDirectorySearch.results(listener: listener) Task { [weak self] in - let throttledListener = listener - ._throttle(for: .milliseconds(500), reducing: { result, next in - (result ?? []) + next - }) - - for await roomEntriesUpdate in throttledListener { + for await roomEntriesUpdate in listener { guard let self else { break } Logger.matrixClient.info("room search updating UI") diff --git a/Mactrix/Models/LiveSpaceRoomList.swift b/Mactrix/Models/LiveSpaceRoomList.swift index 83b0658..d328c71 100644 --- a/Mactrix/Models/LiveSpaceRoomList.swift +++ b/Mactrix/Models/LiveSpaceRoomList.swift @@ -38,7 +38,7 @@ final class LiveSpaceRoomList { spaceHandle = spaceRoomList.subscribeToSpaceUpdates(listener: spaceListener) Task { [weak self] in - for await space in spaceListener._throttle(for: .milliseconds(500)) { + for await space in spaceListener.debounce(for: .milliseconds(500)) { guard let self else { break } self.space = space } @@ -50,12 +50,7 @@ final class LiveSpaceRoomList { roomsHandle = spaceRoomList.subscribeToRoomUpdate(listener: roomsListener) Task { [weak self] in - let throttledListener = roomsListener - ._throttle(for: .milliseconds(500), reducing: { result, next in - (result ?? []) + next - }) - - for await roomUpdates in throttledListener { + for await roomUpdates in roomsListener { guard let self else { return } for update in roomUpdates { @@ -93,7 +88,7 @@ final class LiveSpaceRoomList { paginateHandle = spaceRoomList.subscribeToPaginationStateUpdates(listener: paginateListener) Task { [weak self] in - for await state in paginateListener._throttle(for: .milliseconds(500)) { + for await state in paginateListener.debounce(for: .milliseconds(500)) { self?.paginationState = state } } diff --git a/Mactrix/Models/LiveSpaceService.swift b/Mactrix/Models/LiveSpaceService.swift index 4ae380c..ca984cc 100644 --- a/Mactrix/Models/LiveSpaceService.swift +++ b/Mactrix/Models/LiveSpaceService.swift @@ -27,12 +27,7 @@ public final class LiveSpaceService { self.spaceHandle = await self.spaceService.subscribeToTopLevelJoinedSpaces(listener: listener) Task { [weak self] in - let throttledListener = listener - ._throttle(for: .milliseconds(500), reducing: { result, next in - (result ?? []) + next - }) - - for await roomUpdates in throttledListener { + for await roomUpdates in listener { guard let self else { break } for update in roomUpdates { diff --git a/Mactrix/Models/LiveTimeline.swift b/Mactrix/Models/LiveTimeline.swift index 37e4ce2..66e9f54 100644 --- a/Mactrix/Models/LiveTimeline.swift +++ b/Mactrix/Models/LiveTimeline.swift @@ -97,12 +97,7 @@ public final class LiveTimeline { timelineHandle = await timeline.addListener(listener: listener) Task { [weak self] in - let throttledListener = listener - ._throttle(for: .milliseconds(500), reducing: { result, next in - (result ?? []) + next - }) - - for await diff in throttledListener { + for await diff in listener { guard let self else { break } updateTimeline(diff: diff) } diff --git a/Mactrix/Models/MatrixClient.swift b/Mactrix/Models/MatrixClient.swift index ad417a6..445b481 100644 --- a/Mactrix/Models/MatrixClient.swift +++ b/Mactrix/Models/MatrixClient.swift @@ -28,7 +28,7 @@ class MatrixClient { storePassphrase = userSession.storePassphrase client = try await Self.clientBuilder(homeServer: userSession.homeserverURL, storeId: storeID, storePassphrase: storePassphrase) - //.enableOidcRefreshLock() + // .enableOidcRefreshLock() .setSessionDelegate(sessionDelegate: self) .build() @@ -151,12 +151,7 @@ class MatrixClient { roomListEntriesHandle = _roomListEntriesHandle Task { [weak self] in - let throttledListener = roomEntriesListener - ._throttle(for: .milliseconds(500), reducing: { result, next in - (result ?? []) + next - }) - - for await roomEntries in throttledListener { + for await roomEntries in roomEntriesListener { guard let self else { break } self.updateRoomEntries(roomEntriesUpdate: roomEntries) } @@ -248,14 +243,14 @@ extension MatrixClient: UI.ImageLoader { // since a typical JPEG can be 20-50× larger once decoded. static let imageCache: NSCache = { let cache = NSCache() - cache.totalCostLimit = 256 * 1024 * 1024 // 256MB decoded pixels + cache.totalCostLimit = 256 * 1024 * 1024 // 256MB decoded pixels return cache }() - private static let imageCacheMaxObjectCost = 64 * 1024 * 1024 // 64MB per object (~8000x2000px RGBA) + private static let imageCacheMaxObjectCost = 64 * 1024 * 1024 // 64MB per object (~8000x2000px RGBA) static func setCachedImage(_ image: NSImage, forKey key: NSString) { - let cost = Int(image.size.width * image.size.height) * 4 // decoded RGBA bytes + let cost = Int(image.size.width * image.size.height) * 4 // decoded RGBA bytes guard cost <= imageCacheMaxObjectCost else { return } imageCache.setObject(image, forKey: key, cost: cost) } @@ -266,7 +261,7 @@ extension MatrixClient: UI.ImageLoader { } func loadImage(matrixUrl: String, size: CGSize?) async throws -> Image? { - let cacheKey: NSString = if let size { + let cacheKey = if let size { NSString(string: "\(matrixUrl)_\(Int(size.width))x\(Int(size.height))") } else { NSString(string: matrixUrl) diff --git a/Mactrix/Models/SidebarRoom.swift b/Mactrix/Models/SidebarRoom.swift index 30e5a7f..72898d8 100644 --- a/Mactrix/Models/SidebarRoom.swift +++ b/Mactrix/Models/SidebarRoom.swift @@ -18,7 +18,7 @@ public final class SidebarRoom: Identifiable { Task { do { - roomInfo = try await room.roomInfo() + self.roomInfo = try await room.roomInfo() } catch { Logger.SidebarRoom.error("Failed to fetch initial room info: \(error)") } @@ -50,7 +50,7 @@ public final class SidebarRoom: Identifiable { roomInfoHandle = room.subscribeToRoomInfoUpdates(listener: listener) listenerTask = Task { [weak self] in - for await roomInfo in listener._throttle(for: .milliseconds(500)) { + for await roomInfo in listener.debounce(for: .milliseconds(500)) { guard let self, !Task.isCancelled else { break } self.roomInfo = roomInfo }