美文网首页
swift-RxSwift简单使用(一)

swift-RxSwift简单使用(一)

作者: 何龙HL | 来源:发表于2019-07-23 23:35 被阅读0次

    本篇会先介绍一些RxSwift这个响应式框架的基本使用。

    RxSwift学习的必要性

    复合 - Rx 就是和复合的代名词
    复用 - 复用性比较强,代码量降低
    清晰 - 因为声明都是不可变更,代码函数式编程可读性强
    易用 - 理解容易,还抽象了异步编程,统一代码风格
    稳定 - 因为Rx是完全通过单元测试的

    RxSwift 基本介绍

    gitHub地址

    https://github.com/ReactiveX/RxSwift
    

    如何导入

    CocoaPods

    # Podfile
    use_frameworks!
    
    target 'YOUR_TARGET_NAME' do
        pod 'RxSwift', '~> 5'
        pod 'RxCocoa', '~> 5'
    end
    
    # RxTest and RxBlocking make the most sense in the context of unit/integration tests
    target 'YOUR_TESTING_TARGET' do
        pod 'RxBlocking', '~> 5'
        pod 'RxTest', '~> 5'
    end
    

    Carthage

    github "ReactiveX/RxSwift" ~> 5.0
    

    RxSwift基本使用

    RxSwift基本使用.png

    下面针对UIButton为例子做一个举例
    比如我们点击了一个Btn,想要做一些事情
    正常写法

            self.button.addTarget(self, action: #selector(clickAction), for: .touchUpInside)
    //然后定义这个方法
    @objc func clickAction(){
            print("点击了btn")
        }
    

    RxSwift写法

    self.button.rx.controlEvent(.touchUpOutside)
                .subscribe(onNext: { () in
                    print("点击了btn")
                })
            .disposed(by: disposeBag)
    

    另一中写法

    self.button.rx.tap
                .subscribe(onNext: { () in
                    print("点击了btn")
                })
                .disposed(by: disposeBag)
    

    这个时候就比较有意思了,为什么通过调用rx.tap也可以实现这样的效果呢?

    /*
    我们点击到tap里面查看,发现它返回的其实就是上面的controlEvent(.touchUpInside),
    也就是说开发者为了我们使用,将这个东东直接简化成了.tap,去代替了controlEvent(.touchUpInside)
    毕竟我们使用UIButton大部分都是使用的UIControlTouchUpInside
    **/
    extension Reactive where Base: UIButton {
        
        /// Reactive wrapper for `TouchUpInside` control event.
        public var tap: ControlEvent<Void> {
            return controlEvent(.touchUpInside)
        }
    }
    

    RxSwift核心-Observable

    通过上面的介绍之后,我们再来研究一下RxSwift是如何实现这一系列的事情的。


    Observable.jpg

    1.创建序列
    通过Observable.create来创建一个可被观察的序列

     let ob = Observable<Any>.create { (obserber) -> Disposable in
                return Disposables.create()
            }
    

    2.订阅序列
    通过ob.subscribe来订阅
    3.发送信号
    通过.next() .onCompleted() .onError来发送信号

    具体代码如下

    // 1:创建序列
            let ob = Observable<Any>.create { (obserber) -> Disposable in
                // 3:发送信号
                obserber.onNext("继续")
                obserber.onCompleted()
                obserber.onError(NSError.init(domain: "coocieeror", code: 10087, userInfo: nil))
                return Disposables.create()
            }
    // 2:订阅信号
            let _ = ob.subscribe(onNext: { (text) in
                print("订阅")
            }, onError: { (error) in
                print("error: \(error)")
            }, onCompleted: {
                print("完成")
            }) {
                print("销毁")
            }
    

    具体解释目前还没有理解完整,后期持续更新关于Observable核心流程相关问题。欢迎大家指正~


    Observable-核心流程.jpg

    相关文章

      网友评论

          本文标题:swift-RxSwift简单使用(一)

          本文链接:https://www.haomeiwen.com/subject/lopzlctx.html