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<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 事件



©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 写这篇文章是为了记录下自己在对于RxSwift的学习过程中的概念理解,操作步骤以及心得体会,以便于在以后复习...
    Henry_Jeannie阅读 3,265评论 0 3
  • 一、关于Swift 苹果公司有两种开发语言,大儿子Objective-C,这几年已经很久没更新过新东西了,小儿子S...
    Q海龙阅读 5,791评论 0 7
  • 函数响应式编程FRP 之前学习过Objective-C下的FRP第三方开源框架ReactiveCocoa,部分学习...
    o慢慢o阅读 4,417评论 0 0
  • 一、函数响应式编程思想 (一)概念 这里借用百度百科的官方定义 函数式编程是种编程方式,它将电脑运算视为函数的计算...
    小强_123阅读 2,895评论 0 0
  • 今天早上和儿子发生了一些不愉快的事情,自己久久不能释怀,以为儿子像往常一样,会玩够回家,心里一直很烦躁,甚至还暗自...
    放飞自己和孩子阅读 1,607评论 0 0

友情链接更多精彩内容