Skip to content

Commit

Permalink
从后台进入到APP时自动刷新消息列表
Browse files Browse the repository at this point in the history
  • Loading branch information
Finb committed Jan 6, 2025
1 parent 30eb46d commit 9e8162e
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 20 deletions.
17 changes: 5 additions & 12 deletions Controller/MessageListViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ class MessageListViewController: BaseViewController<MessageListViewModel> {
private let itemDeleteInGroupRelay = PublishRelay<MessageItemModel>()
/// 下拉刷新事件流
private let refreshRelay = PublishRelay<Void>()
/// 重新刷新已加载的页的数据 (最多10页)
private let reloadRelay = PublishRelay<Void>()

override func makeUI() {
navigationItem.searchController = UISearchController(searchResultsController: nil)
Expand All @@ -96,20 +98,10 @@ class MessageListViewController: BaseViewController<MessageListViewModel> {
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)

// 点击群组消息,展开群
Expand Down Expand Up @@ -201,7 +193,8 @@ class MessageListViewController: BaseViewController<MessageListViewModel> {
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 刷新状态
Expand Down
33 changes: 25 additions & 8 deletions Controller/MessageListViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ class MessageListViewModel: ViewModel, ViewModelType {
var groupToggleTap: Driver<Void>
/// 搜索
var searchText: Observable<String?>
/// 重新刷新已加载的页的数据 (最多10页,超过则不刷新)
var reload: Driver<Void>
}

struct Output {
Expand Down Expand Up @@ -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 []
}
Expand All @@ -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 []
}
Expand Down Expand Up @@ -178,7 +179,6 @@ class MessageListViewModel: ViewModel, ViewModelType {
items.append(.messageGroup(name: group ?? NSLocalizedString("default"), totalCount: messageResult.count, messages: messages))
}
}
page += 1
return items
}

Expand All @@ -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 {
Expand Down Expand Up @@ -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 }
Expand Down

0 comments on commit 9e8162e

Please sign in to comment.