MJRefresh+Rx.swift 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. //
  2. // MJRefresh+Rx.swift
  3. // Bark
  4. //
  5. // Created by huangfeng on 2020/11/22.
  6. // Copyright © 2020 Fin. All rights reserved.
  7. //
  8. import Foundation
  9. import MJRefresh
  10. import RxCocoa
  11. import RxSwift
  12. extension Reactive where Base: MJRefreshComponent {
  13. var refresh: ControlEvent<Void> {
  14. let source = Observable<Void>.create { [weak control = self.base] observer -> Disposable in
  15. MainScheduler.ensureExecutingOnScheduler()
  16. guard let control = control else {
  17. observer.onCompleted()
  18. return Disposables.create()
  19. }
  20. control.refreshingBlock = {
  21. observer.onNext(())
  22. }
  23. return Disposables.create()
  24. }
  25. return ControlEvent(events: source)
  26. }
  27. }
  28. enum MJRefreshAction {
  29. /// 不做任何事情
  30. case none
  31. /// 开始刷新
  32. case begainRefresh
  33. /// 停止刷新
  34. case endRefresh
  35. /// 开始加载更多
  36. case begainLoadmore
  37. /// 停止加载更多
  38. case endLoadmore
  39. /// 显示无更多数据
  40. case showNomoreData
  41. /// 重置无更多数据
  42. case resetNomoreData
  43. }
  44. extension Reactive where Base: UIScrollView {
  45. /// 执行的操作类型
  46. var refreshAction: Binder<MJRefreshAction> {
  47. return Binder(base) { target, action in
  48. switch action {
  49. case .begainRefresh:
  50. // 下拉刷新使用 UIRefreshControl
  51. if let control = target.refreshControl {
  52. control.beginRefreshing()
  53. }
  54. case .endRefresh:
  55. if let control = target.refreshControl {
  56. control.endRefreshing()
  57. }
  58. case .begainLoadmore:
  59. if let footer = target.mj_footer {
  60. footer.beginRefreshing()
  61. }
  62. case .endLoadmore:
  63. if let footer = target.mj_footer {
  64. footer.endRefreshing()
  65. }
  66. case .showNomoreData:
  67. if let footer = target.mj_footer {
  68. footer.endRefreshingWithNoMoreData()
  69. }
  70. case .resetNomoreData:
  71. if let footer = target.mj_footer {
  72. footer.resetNoMoreData()
  73. }
  74. case .none:
  75. break
  76. }
  77. }
  78. }
  79. }