From 391bfec7863a9d953bedb380e67fa9d1309c1184 Mon Sep 17 00:00:00 2001 From: Avently <7953703+avently@users.noreply.github.com> Date: Fri, 17 Jan 2025 14:12:06 -0800 Subject: [PATCH] performance --- .../Shared/Views/Chat/ChatItemsMerger.swift | 9 +++++++-- apps/ios/Shared/Views/Chat/ReverseList.swift | 19 ++++++++++--------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/ChatItemsMerger.swift b/apps/ios/Shared/Views/Chat/ChatItemsMerger.swift index 368f12ba57..b69721864e 100644 --- a/apps/ios/Shared/Views/Chat/ChatItemsMerger.swift +++ b/apps/ios/Shared/Views/Chat/ChatItemsMerger.swift @@ -14,10 +14,11 @@ struct MergedItems { let splits: [SplitRange] // chat item id, index in list let indexInParentItems: Dictionary + let snapshot: NSDiffableDataSourceSnapshot static func create(_ items: [ChatItem], _ unreadCount: Int, _ revealedItems: Set, _ chatState: ActiveChatState) -> MergedItems { if items.isEmpty { - return MergedItems(items: [], splits: [], indexInParentItems: [:]) + return MergedItems(items: [], splits: [], indexInParentItems: [:], snapshot: NSDiffableDataSourceSnapshot()) } let unreadAfterItemId = chatState.unreadAfterItemId @@ -107,10 +108,14 @@ struct MergedItems { indexInParentItems[item.id] = visibleItemIndexInParent index += 1 } + var snapshot = NSDiffableDataSourceSnapshot() + snapshot.appendSections([ReverseListSection.main]) + snapshot.appendItems(mergedItems) return MergedItems( items: mergedItems, splits: splitRanges, - indexInParentItems: indexInParentItems + indexInParentItems: indexInParentItems, + snapshot: snapshot ) } } diff --git a/apps/ios/Shared/Views/Chat/ReverseList.swift b/apps/ios/Shared/Views/Chat/ReverseList.swift index 8d8cb40111..e5220cab93 100644 --- a/apps/ios/Shared/Views/Chat/ReverseList.swift +++ b/apps/ios/Shared/Views/Chat/ReverseList.swift @@ -10,6 +10,8 @@ import SwiftUI import Combine import SimpleXChat +enum ReverseListSection { case main } + /// A List, which displays it's items in reverse order - from bottom to top struct ReverseList: UIViewControllerRepresentable { @Binding var mergedItems: MergedItems @@ -61,20 +63,19 @@ struct ReverseList: UIViewControllerRepresentable { // so it's better to just wait until dragging ends if !mergedItems.splits.isEmpty && controller.tableView.isDragging/* && !controller.tableView.isDecelerating*/ { controller.runBlockOnEndDecelerating = { - controller.update(mergedItems.items) + controller.update(mergedItems.items, mergedItems.snapshot) } } else { controller.runBlockOnEndDecelerating = nil - controller.update(mergedItems.items) + controller.update(mergedItems.items, mergedItems.snapshot) } } } /// Controller, which hosts SwiftUI cells public class Controller: UITableViewController { - private enum Section { case main } var representer: ReverseList - private var dataSource: UITableViewDiffableDataSource! + private var dataSource: UITableViewDiffableDataSource! private let updateFloatingButtons = PassthroughSubject() private var bag = Set() @@ -115,7 +116,7 @@ struct ReverseList: UIViewControllerRepresentable { } // 3. Configure data source - self.dataSource = UITableViewDiffableDataSource( + self.dataSource = UITableViewDiffableDataSource( tableView: tableView ) { (tableView, indexPath, item) -> UITableViewCell? in let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseId, for: indexPath) @@ -255,7 +256,7 @@ struct ReverseList: UIViewControllerRepresentable { } } - func update(_ items: [MergedItem]) { + func update(_ items: [MergedItem], _ snapshot: NSDiffableDataSourceSnapshot) { logger.debug("LALAL STEP 0 \(items.count)") let prevSnapshot = dataSource.snapshot() logger.debug("LALAL STEP 1") @@ -271,9 +272,9 @@ struct ReverseList: UIViewControllerRepresentable { updateFloatingButtons.send() return } - var snapshot = NSDiffableDataSourceSnapshot() - snapshot.appendSections([.main]) - snapshot.appendItems(items) +// var snapshot = NSDiffableDataSourceSnapshot() +// snapshot.appendSections([.main]) +// snapshot.appendItems(items) logger.debug("LALAL STEP 3") dataSource.defaultRowAnimation = .none