博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RxSwift 对 MJRefresh 使用的封装
阅读量:7059 次
发布时间:2019-06-28

本文共 2268 字,大约阅读时间需要 7 分钟。

 

对于一个很常用的两个库, MJRefresh 如何可以像 UIButton 使用方式呢:

btn.rx.tap.subscribe(...)

 

Rxswift 中的很多类似处理的方式都使用了跟下面极为相似的代码,

进行针对
UIControl的适配时,是通过一个中间层
ControlTarget来完成的,为了保持这个
ControlTarget实例的存活,使得它不会被自动释放,先用一个集合来包裹住它,并将这个集合设置为目标
UIControl的关联对象。此时我们可以将这个中间层
ControlTarget看做是这个事件流管道中的一个资源,这个资源的销毁是由目标
UIControl来决定的
 

个人写的代码如下:

import UIKitimport MJRefreshimport RxSwiftimport RxCocoaclass RxTarget: NSObject, Disposable {  // RxTarget 是 Rxswift 源码    private var retainSelf: RxTarget?    override init() {        super.init()        self.retainSelf = self    }    func dispose() {        self.retainSelf = nil    }}final class RefreshTarget
: RxTarget { typealias Callback = MJRefreshComponentRefreshingBlock var callback: Callback? weak var component:Component? let selector = #selector(RefreshTarget.eventHandler) init(_ component: Component,callback:@escaping Callback) { self.callback = callback self.component = component super.init() component.setRefreshingTarget(self, refreshingAction: selector) } @objc func eventHandler() { if let callback = self.callback { callback() } } override func dispose() { super.dispose() self.component?.refreshingBlock = nil self.callback = nil }}extension Reactive where Base: MJRefreshComponent { var event: ControlEvent
{ let source: Observable
= Observable.create { [weak control = self.base] observer in MainScheduler.ensureExecutingOnScheduler() guard let control = control else { observer.on(.completed) return Disposables.create() } let observer = RefreshTarget(control) { observer.on(.next(control)) } return observer }.takeUntil(deallocated) return ControlEvent(events: source) }}

 

怎么使用呢? 

collectionView.mj_header.rx.event            .map { _ in Reactor.Action.refresh }            .bind(to: reactor.action)            .disposed(by: disposeBag)         collectionView.mj_footer.rx.event            .map { _ in Reactor.Action.loadMore }            .bind(to: reactor.action)            .disposed(by: disposeBag)

 

更多内容,请到我的

 

转载于:https://www.cnblogs.com/Ohero/p/7783995.html

你可能感兴趣的文章
用了一天的时间,linux下expect实现ssh自动登录服务器记,鄙视下网上各种抄来抄去残段子...
查看>>
青岛市李沧区搭建人才大数据平台
查看>>
Linux下自动化监控内存、存储空间!
查看>>
iOS 7 表视图顶部空白解决
查看>>
中科院院士姚期智:我们已经来到量子时代的最后一里路
查看>>
“前.NET Core时代”如何实现跨平台代码重用 ——程序集重用
查看>>
一哄而起云计算(透视)
查看>>
如何实现对上下文(Context)数据的统一管理 [提供源代码下载]
查看>>
RvmTranslator Translate RVM to 3D PDF
查看>>
New Release: patterns & practices App Arch Guide 2.0 Beta 1
查看>>
服务企业互联网化用友进入3.0时代
查看>>
Fortinet FortiGuard安全实验室解密APT攻击的那些事儿
查看>>
用友云重装出发:你想得到的企业服务都在这
查看>>
经典网络的ECS实例支持升级到企业级实例
查看>>
定位与大数据邂逅,Wi-Fi大不相同
查看>>
物联网技术正颠覆零售行业
查看>>
《OpenGL编程指南(原书第9版)》——1.2 初识OpenGL程序
查看>>
大数据为推动中国出版“走出去”提供新机遇
查看>>
物联网路径,美国运营商怎么走?
查看>>
除Hadoop大数据技术外,还需了解的九大技术
查看>>