RxSwift (一) 初探

编程思想

  • Swift 是一门静态语言
  • RxSwift 响应式编程思想

RxSwift 学习的必要性

  • 复合
  • 复用
  • 清晰
  • 易用
  • 稳定

函数式编程

  • 使用函数做为参数
  • 源于数学的 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 直接监听

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

// rx.tap 默认调用的 .touchUpInside 事件
button.rx.controlEvent(.touchUpInside)
            .debug()
            .subscribe()
            .disposed(by: disposeBag)

TextFiled 的输入监听

// 获取输入的Text
textFiled.rx.text.orEmpty
            .debug()
            .subscribe()
            .disposed(by: disposeBag)
            
// text 实时绑定到 button 的 title 上
textFiled.rx.text.orEmpty
            .bind(to: button.rx.title())
            .disposed(by: disposeBag)

ScrollView

// 获取滚动的位置
scrollView.rx.contentOffset
            .debug()
            .subscribe()
            .disposed(by: disposeBag)

通知

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

定时器 Time(底层实现原理封装了GCD的Timer)

Observable.interval(1, scheduler: MainScheduler.instance)
            .debug()
            .subscribe()
            .disposed(by: disposeBag)
            
// 底层实现的是一样的
Observable.timer(1, scheduler: MainScheduler.instance)

URLSession 网络请求

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

万物皆 Rx

  • 实现ReactiveCompatible协议
public protocol ReactiveCompatible {
    /// Extended type
    associatedtype ReactiveBase

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

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

    /// Reactive extensions.
    var rx: Reactive { get set }
}

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

序列

  1. 创建序列
  2. 订阅信号
  3. 发送信号 (onNext, onError, onCompleted)

创建序列

let ob = Observable.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

序列创建流程

  1. 创建序列 -> Observable.create -> AnonymousObservable匿名类部类保存闭包(函数式保存_subscribeHandler)-> producer.subscribe -> run
  2. 订阅信号 -> AnonymousObserver 创建一个观察者(通过尾随闭包创建) -> 保存了 EventHandler 事件
// 创建序列
let ob = Observable.create {}
 
-> Create.swift: AnonymousObservable() // 匿名类部类保存 闭包
-> _subscribeHandler 
    
// 订阅
_ = ob.subscribe(onNext: { _ in       
}, onError: { _ in
}, onCompleted: {
}) {
}

subscribe{} 实现
let observer = AnonymousObserver { } 创建订阅者,尾随闭包
-> self.asObservable().subscribe(observer)

-> Producer. subscribe
-> AnonymousObservable.run
-> AnonymousObservableSink.run -> _subscribeHandler 发送 event 事件



你可能感兴趣的:(RxSwift (一) 初探)