RxSwift & RxCocoa 函數(shù)式編程

函數(shù)式編程

  • 響應(yīng)式編程(Reactive Programming,簡(jiǎn)稱(chēng) RP)
  • 也是一種范式編程
  • 一般與函數(shù)式融合一起,所以也叫函數(shù)響應(yīng)式編程(Functiona Reactive Programming,簡(jiǎn)稱(chēng) FRP)

ReactiveX

  • 有很多種編程語(yǔ)言,如RxJava RxSwift...
  • 安裝
    # 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
    

RxSwift 核心角色

  • Observable: 負(fù)責(zé)發(fā)送實(shí)踐的 (Event)

  • Observer: 負(fù)責(zé)訂閱 Observable ,監(jiān)聽(tīng) Observable 發(fā)送的事件(Event)

    public enum Event<Element> {
        
        case next(Element) ` 攜帶數(shù)據(jù) `
        
        case error(Swift.Error)  `遵守 swift error 協(xié)議,后面消息不發(fā)送`
        
        case completed  ` 觀(guān)察者終止行動(dòng) `
    }
    
    

Observable 發(fā)布消息

  • 代碼
    let obs = Observable<Int>.create{ observer in
    
        observer.onNext(11)
        observer.onNext(22)
        observer.onNext(33)
        observer.onCompleted() `完成監(jiān)聽(tīng)`
        return Disposables.create()
    }
    

subscribe 監(jiān)聽(tīng)消息

  • 代碼
    import RxCocoa
    import RxSwift
    
    let bag = DisposeBag() // 回收袋
    
    //第一種方法
        obs.subscribe { event in
            
            switch event {
            case .next(let element):
                print("next", element)
            case .error(let error):
                print("error", error)
            case .completed:
                print("completed")
            }.disposed(by: bag)
        }
        
        
    // 第二種方法
    
        obs.subscribe(onNext: { (element) in
                print("next", element)
            }, onError: { (error) in
                print("error", error)
            }, onCompleted: {
                print("completed")
            })        
            
        
        // 定時(shí)器功能
        let obs = Observable<Int>.timer(.seconds(3), period: .seconds(5), scheduler: MainScheduler.instance)
        // 3 秒后啟動(dòng)定時(shí)器,每間隔 5 秒,在 主線(xiàn)程上發(fā)一次消息
        
    

Disposable 釋放 obs

  • 每當(dāng) Observable 被訂閱時(shí),都會(huì)返回一個(gè) Disposable 實(shí)例,當(dāng)調(diào)用 Disposable 的 dispose , 就相當(dāng)于取消訂閱

  • 在不需要再接收事件時(shí),建議取消訂閱,釋放資源,常見(jiàn)有三種取消訂閱方式

    // 第一種
    obs.subscribe { event in
          // do something  
    }.dispose()  //立即取消訂閱
    
    
    // 第二種, 
    obs.subscribe { event in
          // do something  
    }.dispose(by: bag)  //bag 回收袋,controller 銷(xiāo)毀, bag 銷(xiāo)毀,obs 調(diào)用取消訂閱接口
    
    
    //第三種
    obs
    .takeUntil(self.rx.deallocated) //直到 控制器調(diào)用 deallocated 方法,取消訂閱
    .subscribe { event in
        // do something
    }
    

創(chuàng)建 Observer

  • 通過(guò) AnyObserver 類(lèi)型創(chuàng)建 obs

        let obs = AnyObserver<Int>.init { event in
            switch event {
                case .next(let element):
                    print("next", element)
                case .error(let error):
                    print("error", error)
                case .completed:
                    print("completed")
            }
        }
            
        // 只調(diào)用一次,發(fā)送消息內(nèi)容為 5
        Observable.just(5).subscribe(obs).dispose()           
    
    
  • 通過(guò) Observable 類(lèi)型創(chuàng)建 obs

        let obs = Observable<Int>.create{ observer in
            observer.onNext(33)
            observer.onCompleted()
            return Disposables.create()
        }        
            
        //監(jiān)聽(tīng)
        obs.subscribe(onNext: { (element) in
                print("next", element)
            }, onError: { (error) in
                print("error", error)
            }, onCompleted: {
                print("completed")
        }).disposed(by: bag)    
            
        obs.subscribe { event in
            switch event {
                case .next(let element):
                    print("next", element)
                case .error(let error):
                    print("error", error)
                case .completed:
                    print("completed")
            }
        }.dispose()    
        
    
  • 通過(guò) bind 創(chuàng)建

        
        let binder = Binder<String>(label) { label, text in
            label.text = text
        }
         
        // 監(jiān)聽(tīng)
        Observable.just(1).map{ "數(shù)值: \($0)" }.subscribe(binder).dispose()
        Observable.just(1).map{ "數(shù)值: \($0)" }.bind(to:binder).dispose()
        
    

持續(xù)更新中...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容