RxSwift 如何知道 TableView 重新加载结束

Posted

技术标签:

【中文标题】RxSwift 如何知道 TableView 重新加载结束【英文标题】:RxSwift how to know end of TableView reload 【发布时间】:2019-04-05 08:38:17 【问题描述】:

我想知道 reloadTableView 的结束 然后我想向下滚动到表格视图的底部。

在我使用RxSwift之前 就在reloadData之后 可以使用setContentOffSetScrollToRow

我用找到的代码试了一下。 从来没有打电话给endUpdates

var replyList : BehaviorRelay<[Reply]>!

func bind()

    replyViewModel.replyList
       .asDriver()
       .drive(replyTableView.rx.items) [weak self] (tableView,row,item) in
           return self?.makeReplyCell(tableView: tableView, replyInfo: item) ?? UITableViewCell()

                
       .disposed(by: disposeBag)

    replyTableView.endUpdatesEvent
        .asObservable()
        .subscribe( _ in
            print("Scroll To Bottom")
        )
        .disposed(by: disposeBag)


import Foundation
import RxCocoa
import RxSwift

extension UITableView 

    /// Reactive wrapper for `UITableView.insertRows(at:with:)`
    var insertRowsEvent: ControlEvent<[IndexPath]> 
        let source = rx.methodInvoked(#selector(UITableView.insertRows(at:with:)))
                .map  a in
                    return a[0] as! [IndexPath]
                
        return ControlEvent(events: source)
    

    /// Reactive wrapper for `UITableView.endUpdates()`
    var endUpdatesEvent: ControlEvent<Bool> 
        let source = rx.methodInvoked(#selector(UITableView.endUpdates))
                .map  _ in
                    return true
                
        return ControlEvent(events: source)
    

    /// Reactive wrapper for when the `UITableView` inserted rows and ended its updates.
    var insertedItems: ControlEvent<[IndexPath]> 
        let insertEnded = Observable.combineLatest(
                insertRowsEvent.asObservable(),
                endUpdatesEvent.asObservable(),
                resultSelector:  (insertedRows: $0, endUpdates: $1) 
        )
        let source = insertEnded.map  $0.insertedRows 
        return ControlEvent(events: source)
    

【问题讨论】:

我不知道在 rxswift 中是否可行。但也许你可以看看 uitableview 提供的观察者而不是 dataArray。 【参考方案1】:

UITableView.endUpdates() 在这里对您没有帮助,因为您没有直接调用它,并且在后台可能根本不会调用它(至少使用 rx 包装器)。

更合理的解决方案是观察layoutSubviews() 方法的调用,您可以在其中验证单元格是否在此布局周期中重新加载并且它们存在 - 例如,您可以滚动到它们。如果调用了layoutSubviews(),但表格视图中还没有单元格,那么您等待下一个循环并再次检查。

【讨论】:

以上是关于RxSwift 如何知道 TableView 重新加载结束的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RxSwift 中将多个数据模型绑定到 TableView

正确使用 RxSwift 和 TableView

基于属性的 RxSwift tableView 更新

如何在 RxSwift 中使用 tableView 数据源(numberOfRowsInSection)?

RxSwift TableView - 如何设置 numberOfRowsInSection?

删除项目 RxSwift MVVM 模式