RxSwift (一) 初探

編程思想

  • Swift 是一門靜態(tài)語言
  • RxSwift 響應(yīng)式編程思想

RxSwift 學(xué)習(xí)的必要性

  • 復(fù)合
  • 復(fù)用
  • 清晰
  • 易用
  • 穩(wěn)定

函數(shù)式編程

  • 使用函數(shù)做為參數(shù)
  • 源于數(shù)學(xué)的 y = f(x) -> x = f(x) -> y = f(f(x))

簡單使用

KVO

// var 

@objc dynamic var name: String = ""

var disposeBag = DisposeBag()

 rx.observeWeakly(String.self, "name")
            .debug()
            .subscribe()
            .disposed(by: disposeBag)
            
// print 
-> subscribed
-> Event next(Optional(""))

Button 直接監(jiān)聽

button.rx.tap
            .debug()
            .subscribe()
            .disposed(by: disposeBag)
            

// rx.tap 默認(rèn)調(diào)用的 .touchUpInside 事件
button.rx.controlEvent(.touchUpInside)
            .debug()
            .subscribe()
            .disposed(by: disposeBag)

TextFiled 的輸入監(jiān)聽

// 獲取輸入的Text
textFiled.rx.text.orEmpty
            .debug()
            .subscribe()
            .disposed(by: disposeBag)
            
// text 實(shí)時(shí)綁定到 button 的 title 上
textFiled.rx.text.orEmpty
            .bind(to: button.rx.title())
            .disposed(by: disposeBag)

ScrollView

// 獲取滾動(dòng)的位置
scrollView.rx.contentOffset
            .debug()
            .subscribe()
            .disposed(by: disposeBag)

通知

NotificationCenter.default.rx.notification(UIApplication.willEnterForegroundNotification)
            .debug()
            .subscribe()
            .disposed(by: disposeBag)

定時(shí)器 Time(底層實(shí)現(xiàn)原理封裝了GCD的Timer)

Observable<Int>.interval(1, scheduler: MainScheduler.instance)
            .debug()
            .subscribe()
            .disposed(by: disposeBag)
            
// 底層實(shí)現(xiàn)的是一樣的
Observable<Int>.timer(1, scheduler: MainScheduler.instance)

URLSession 網(wǎng)絡(luò)請求

URLSession.shared.rx.response(request: URLRequest(url: URL(string: "www.baidu.com")!))
            .debug()
            .subscribe()
            .disposed(by: disposeBag)

萬物皆 Rx

  • 實(shí)現(xiàn)ReactiveCompatible協(xié)議
public protocol ReactiveCompatible {
    /// Extended type
    associatedtype ReactiveBase

    @available(*, deprecated, message: "Use `ReactiveBase` instead.")
    typealias CompatibleType = ReactiveBase

    /// Reactive extensions.
    static var rx: Reactive<ReactiveBase>.Type { get set }

    /// Reactive extensions.
    var rx: Reactive<ReactiveBase> { get set }
}

// NSObject 的子類都有 Rx
extension NSObject: ReactiveCompatible { }

序列

  1. 創(chuàng)建序列
  2. 訂閱信號
  3. 發(fā)送信號 (onNext, onError, onCompleted)

創(chuàng)建序列

let ob = Observable<Any>.create { (observer) -> Disposable in
            
            observer.onNext("next event")
            observer.onCompleted()
            
            return Disposables.create {
                
            }
        }
        
        _ = ob.debug().subscribe()

有窮序列

// 可觀察序列 - Sequence
// 無限 -> 無窮序列 timer interval
// 有窮序列 -> Array.sequence
    
let arr = [1,2,3,4,5]
    
Observable.just(arr)
    .debug()
    .subscribe()
    .disposed(by: disposeBag)
    
// print: [1, 2, 3]
    
Observable.from(arr)
    .debug()
    .subscribe()
    .disposed(by: disposeBag)
    
// print : 1 2 3 4 5

序列創(chuàng)建流程

  1. 創(chuàng)建序列 -> Observable.create -> AnonymousObservable匿名類部類保存閉包(函數(shù)式保存_subscribeHandler)-> producer.subscribe -> run
  2. 訂閱信號 -> AnonymousObserver 創(chuàng)建一個(gè)觀察者(通過尾隨閉包創(chuàng)建) -> 保存了 EventHandler 事件
// 創(chuàng)建序列
let ob = Observable<Any>.create {}
 
-> Create.swift: AnonymousObservable() // 匿名類部類保存 閉包
-> _subscribeHandler 
    
// 訂閱
_ = ob.subscribe(onNext: { _ in       
}, onError: { _ in
}, onCompleted: {
}) {
}

subscribe{} 實(shí)現(xiàn)
let observer = AnonymousObserver<Element> { } 創(chuàng)建訂閱者,尾隨閉包
-> self.asObservable().subscribe(observer)

-> Producer. subscribe
-> AnonymousObservable.run
-> AnonymousObservableSink.run -> _subscribeHandler 發(fā)送 event 事件



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

相關(guān)閱讀更多精彩內(nèi)容

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