美文网首页
RxSwift (一) 初探

RxSwift (一) 初探

作者: iChuck | 来源:发表于2019-08-12 16:44 被阅读0次

编程思想

  • 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<Int>.interval(1, scheduler: MainScheduler.instance)
            .debug()
            .subscribe()
            .disposed(by: disposeBag)
            
// 底层实现的是一样的
Observable<Int>.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<ReactiveBase>.Type { get set }

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

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

序列

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

创建序列

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

序列创建流程

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

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

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



相关文章

  • RxSwift

    一、RxSwift初探

  • RxSwift-初探

    RxSwift-初探RxSwift核心逻辑-源码分析RxSwift-Observable序列的创建方式RxSwif...

  • RXSwift 初次探索

    RXSwift的最初探索 iOS 中 我们常用到的函数式编程 oc中的RAC 和 swift中的RXSwift 是...

  • RxSwift介绍(一)——RxSwift初探

    之前介绍了RAC在Objective-C环境下RACSignal信号订阅使用流程、宏定义以及各种信号的操作使用。作...

  • RxSwift学习(一) -- RxSwift初探

    一、关于Swift 苹果公司有两种开发语言,大儿子Objective-C,这几年已经很久没更新过新东西了,小儿子S...

  • RxSwift (一) 初探

    编程思想 Swift 是一门静态语言 RxSwift 响应式编程思想 RxSwift 学习的必要性 复合 复用 清...

  • RxSwift-初探

    就问此时此刻还有谁?45度仰望天空,该死!我这无处安放的魅力!RxSwift-初探RxSwift核心逻辑-源码分析...

  • RxSwift-高阶函数(上)

    就问此时此刻还有谁?45度仰望天空,该死!我这无处安放的魅力!RxSwift-初探RxSwift核心逻辑-源码分析...

  • RxSwift-高阶函数(下)

    就问此时此刻还有谁?45度仰望天空,该死!我这无处安放的魅力!RxSwift-初探RxSwift核心逻辑-源码分析...

  • RxSwift学习--核心逻辑再探

    前言 通过上一篇内容RxSwift学习--核心逻辑初探,对RxSwift有了些初步的认知,下面通过源码来看一下Rx...

网友评论

      本文标题:RxSwift (一) 初探

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