From 9e8162e9b6279e4eec26f21e0812dbbb80d31c67 Mon Sep 17 00:00:00 2001 From: Fin Date: Mon, 6 Jan 2025 14:08:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=8E=E5=90=8E=E5=8F=B0=E8=BF=9B=E5=85=A5?= =?UTF-8?q?=E5=88=B0APP=E6=97=B6=E8=87=AA=E5=8A=A8=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Controller/MessageListViewController.swift | 17 ++++------- Controller/MessageListViewModel.swift | 33 ++++++++++++++++------ 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/Controller/MessageListViewController.swift b/Controller/MessageListViewController.swift index a17e62f2..6e7d7642 100644 --- a/Controller/MessageListViewController.swift +++ b/Controller/MessageListViewController.swift @@ -75,6 +75,8 @@ class MessageListViewController: BaseViewController { private let itemDeleteInGroupRelay = PublishRelay() /// 下拉刷新事件流 private let refreshRelay = PublishRelay() + /// 重新刷新已加载的页的数据 (最多10页) + private let reloadRelay = PublishRelay() override func makeUI() { navigationItem.searchController = UISearchController(searchResultsController: nil) @@ -96,20 +98,10 @@ class MessageListViewController: BaseViewController { self?.scrollToTop() }).disposed(by: self.rx.disposeBag) - // 打开APP时,历史消息列表距离上次刷新超过5分钟,则自动刷新一下 - var lastAutoRefreshdate = Date() NotificationCenter.default.rx .notification(UIApplication.willEnterForegroundNotification) - .filter { _ in - let now = Date() - if now.timeIntervalSince1970 - lastAutoRefreshdate.timeIntervalSince1970 > 60 * 5 { - lastAutoRefreshdate = now - return true - } - return false - } .subscribe(onNext: { [weak self] _ in - self?.refreshRelay.accept(()) + self?.reloadRelay.accept(()) }).disposed(by: rx.disposeBag) // 点击群组消息,展开群 @@ -201,7 +193,8 @@ class MessageListViewController: BaseViewController { itemDeleteInGroup: itemDeleteInGroupRelay.asDriver(onErrorDriveWith: .empty()), delete: getBatchDeleteDriver(), groupToggleTap: groupBtn.rx.tap.asDriver(), - searchText: navigationItem.searchController!.searchBar.rx.text.asObservable() + searchText: navigationItem.searchController!.searchBar.rx.text.asObservable(), + reload: reloadRelay.asDriver(onErrorDriveWith: .empty()) )) // tableView 刷新状态 diff --git a/Controller/MessageListViewModel.swift b/Controller/MessageListViewModel.swift index 3ecbb19a..f1808fdc 100644 --- a/Controller/MessageListViewModel.swift +++ b/Controller/MessageListViewModel.swift @@ -42,6 +42,8 @@ class MessageListViewModel: ViewModel, ViewModelType { var groupToggleTap: Driver /// 搜索 var searchText: Observable + /// 重新刷新已加载的页的数据 (最多10页,超过则不刷新) + var reload: Driver } struct Output { @@ -128,7 +130,7 @@ class MessageListViewModel: ViewModel, ViewModelType { } /// 获取 message 列表下一页数据 - private func getListNextPage() -> [MessageListCellItem] { + private func getListNextPage(page: Int, pageCount: Int) -> [MessageListCellItem] { guard let result = results else { return [] } @@ -144,12 +146,11 @@ class MessageListViewModel: ViewModel, ViewModelType { // copy 是因为 message 可能在被删除后,还会被访问导致闪退 messages.append(.message(model: MessageItemModel(message: result[i]))) } - page += 1 return messages } /// 获取 group 列表下一页数据 - private func getGroupNextPage() -> [MessageListCellItem] { + private func getGroupNextPage(page: Int, pageCount: Int) -> [MessageListCellItem] { guard let groups, let results else { return [] } @@ -178,7 +179,6 @@ class MessageListViewModel: ViewModel, ViewModelType { items.append(.messageGroup(name: group ?? NSLocalizedString("default"), totalCount: messageResult.count, messages: messages)) } } - page += 1 return items } @@ -191,16 +191,23 @@ class MessageListViewModel: ViewModel, ViewModelType { } } - private func getNextPage() -> [MessageListCellItem] { + private func getPage(page: Int, pageCount: Int) -> [MessageListCellItem] { if case .group = self.sourceType { // 查看指定分组时,只能按列表查看 - return getListNextPage() + return getListNextPage(page: page, pageCount: pageCount) } if type == .list || !searchText.isEmpty { // 搜索时,也必须按列表查看 - return getListNextPage() + return getListNextPage(page: page, pageCount: pageCount) + } + return getGroupNextPage(page: page, pageCount: pageCount) + } + + private func getNextPage() -> [MessageListCellItem] { + defer { + page += 1 } - return getGroupNextPage() + return getPage(page: self.page, pageCount: self.pageCount) } func transform(input: Input) -> Output { @@ -284,6 +291,16 @@ class MessageListViewModel: ViewModel, ViewModelType { } }).disposed(by: rx.disposeBag) + // 重新加载已加载的页的数据,最多10页 + input.reload.drive(onNext: { [weak self] _ in + guard let self, self.page > 0, self.page <= 10 else { return } + // 刷新已加载的页的数据 + let messages = self.getPage(page: 0, pageCount: self.page * self.pageCount) + messagesRelay.accept( + [MessageSection(header: "model", messages: messages)] + ) + }).disposed(by: rx.disposeBag) + // 删除message input.itemDelete.drive(onNext: { [weak self] item in guard let self else { return }