Skip to content

Instantly share code, notes, and snippets.

@itswenb
Created January 5, 2022 03:23
Show Gist options
  • Save itswenb/d746c259b7aab40f689fa02485e3721c to your computer and use it in GitHub Desktop.
Save itswenb/d746c259b7aab40f689fa02485e3721c to your computer and use it in GitHub Desktop.

Revisions

  1. itswenb created this gist Jan 5, 2022.
    67 changes: 67 additions & 0 deletions MJRefresh+Rx.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,67 @@
    import Foundation
    import RxSwift
    import RxCocoa
    import MJRefresh

    public enum RefreshStatus {
    case none, begainHeaderRefresh, endHeaderRefresh
    case hiddendFooter, showFooter, endFooterRefresh, endFooterRefreshWithNoData
    }

    public protocol Refreshable {
    var refreshStauts: BehaviorRelay<RefreshStatus> { get }
    }

    public extension Refreshable {
    func refreshStatusBind(to scrollView: UIScrollView) -> Disposable {
    return refreshStauts.subscribe(onNext: { [weak scrollV = scrollView] status in
    switch status {
    case .none:
    break
    case .begainHeaderRefresh:
    scrollV?.mj_header?.beginRefreshing()
    case .endHeaderRefresh:
    scrollV?.mj_header?.endRefreshing()
    case .hiddendFooter:
    scrollV?.mj_footer?.isHidden = true
    case .showFooter:
    scrollV?.mj_footer?.isHidden = false
    case .endFooterRefresh:
    scrollV?.mj_footer?.endRefreshing()
    case .endFooterRefreshWithNoData:
    scrollV?.mj_footer?.endRefreshingWithNoMoreData()
    }
    })
    }
    }

    private var kRxRefreshCommentKey: UInt8 = 0

    public extension Reactive where Base: MJRefreshComponent {
    var refreshing: ControlEvent<Void> {
    let source: Observable<Void> = lazyInstanceObservable(&kRxRefreshCommentKey) { () -> Observable<()> in
    Observable.create { [weak control = self.base] observer in
    if let control = control {
    control.refreshingBlock = {
    observer.on(.next(()))
    }
    } else {
    observer.on(.completed)
    }
    return Disposables.create()
    }
    .takeUntil(self.deallocated)
    .share(replay: 1)
    }
    return ControlEvent(events: source)
    }

    private func lazyInstanceObservable<T: AnyObject>(_ key: UnsafeRawPointer, createCachedObservable: () -> T) -> T {
    if let value = objc_getAssociatedObject(self.base, key) as? T {
    return value
    }
    let observable = createCachedObservable()
    objc_setAssociatedObject(self.base, key, observable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    return observable
    }
    }