RxSwift初步学习和探究Observable

363 阅读5分钟

RxSwift初步学习和探究Observable

RxSwift学习指南和参考

大概的使用和理解参考了这边文章 Rxswift的使用详解


什么叫函数式编程,以及函数式编程的思想

函数编程(functional programming,简称FP)的核心就是一切皆函数,函数本质是一种变换x->f(x);函数式编程是一种编程范式,如何写程序的方法论,主要的思想运算过程中写成一系列嵌套的函数。

函数编程的特点
  • 函数是一等公民
    • 可以把函数作为参数传递给另一个参数,即高阶函数
    • 可以返回一个函数,有助于实现闭包和惰性计算
  • 只用表达式,而不用语句
  • 没有副作用
  • 不修改状态
  • 引用透明,函数的输出结果只依赖于输入的参数

Rxswift的只要研究对象

RX中signal,observer,observable,subject主要负责数据的流动,scheduler`负责执行线程相关的操作

探究observable

什么是observable

observable是可观察序列,序列是一系列相同值的集合,并且提供对这些值的迭代能力,可以为有穷序列,也可以为无穷序列。

利用序列的思维能让未来的事情随时响应,这是响应式最核心的应用。

observable的生命周期
  • 有限的next
  • 无穷的next
  • 完成事件complete
  • 错误的时间error
  • 创建序列 let ob = Observable<Any>.create
  • 订阅序列 ob.subscribe
  • send signal
    • observer.onNext
    • observer.onError
    • observer.onComplete
简单探究从创建到订阅 再到收到信号

以下是可观察序列的创建 发送信号 订阅代码

	// 1.创建序列
let ob = Observable<Any>.create { (obserber) -> Disposable in
       // 3:发送信号
       obserber.onNext("发送信号")
       obserber.onCompleted()
       obserber.onError(NSError.init(domain: "XXXX", code: 100886, userInfo: nil))
       return Disposables.create()
   }
        
// 2:订阅信号
let _ = ob.subscribe(onNext: { (text) in
	print("收到:\(text)")
}, onError: { (error) in
	print("error: \(error)")
}, onCompleted: {
	print("完成")
}) {
	print("销毁")
}
  

######下边的创建可观察序列的调用

extension ObservableType {

    /**
         Creates an observable sequence from a specified subscribe method implementation.
    
         - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)
    
         - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.
         - returns: The observable sequence with the specified implementation for the `subscribe` method.
         */
         
    public static func create(_ subscribe: @escaping (RxSwift.AnyObserver<Self.E>) -> Disposable) -> RxSwift.Observable<Self.E>
}

代码点评: 调用的部分显示这是对ObservableType的扩展,而这个ObservableType是一个继承自ObservableConvertibleType的协议,所以这就是一个协议的扩展定义。

代码注释说明create利用指定的订阅实现传建一个序列,可以参考create.swift的中的实现,即create实现了这个协议,那么就可以create的内容了。

create.swift中我们可以看到,对其的实现


extension ObservableType {
    // MARK: create

    /**
     Creates an observable sequence from a specified subscribe method implementation.

     - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)

     - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.
     - returns: The observable sequence with the specified implementation for the `subscribe` method.
     */
    public static func create(_ subscribe: @escaping (AnyObserver<E>) -> Disposable) -> Observable<E> {
        return AnonymousObservable(subscribe)
    }
}

代码点评: 代码返回的数据是return AnonymousObservable(subscribe),即create的调用是把我们的闭包传给AnonymousObservable初始化

接下来看看AnonymousObservable的内容

这段代码将我们的闭包保存到_sunscribeHandler中,到此创建过程结束

在这里我们需要进一步探究Producer


class Producer<Element> : Observable<Element> {
    override init() {
        super.init()
    }
    override func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == Element{...}
    func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {}// 子类具体实现

代码分析 AnonymousObservable是继承自ProducerProducer中实现了subscribe方法,这个是后边订阅会用到的,在此我们可以先Mark一下


下边是订阅的调用流程

在调用subscribe(onNext:_ , onError:_ , onCompleted:_)时 发生了什么 在ObservableType+Extensions.swift的文件中我们可以找到这个代码的实现,同上边的createsubscribe也是ObservableType的扩展协议


/**
Subscribes an element handler, an error handler, a completion handler and disposed handler to an observable sequence.
     
- parameter onNext: Action to invoke for each element in the observable sequence.
- parameter onError: Action to invoke upon errored termination of the observable sequence.
- parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.
- parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has
gracefully completed, errored, or if the generation is canceled by disposing subscription).
- returns: Subscription object used to unsubscribe from the observable sequence.
*/
public func subscribe(onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil)
   -> Disposable {
       let disposable: Disposable
       
       if let disposed = onDisposed {
           disposable = Disposables.create(with: disposed)
       }
       else {
           disposable = Disposables.create()
       }
       
       #if DEBUG
           let synchronizationTracker = SynchronizationTracker()
       #endif
       
       let callStack = Hooks.recordCallStackOnError ? Hooks.customCaptureSubscriptionCallstack() : []
       
       let observer = AnonymousObserver<E> { event in
           
           #if DEBUG
               synchronizationTracker.register(synchronizationErrorMessage: .default)
               defer { synchronizationTracker.unregister() }
           #endif
           
           switch event {
           case .next(let value):
               onNext?(value)
           case .error(let error):
               if let onError = onError {
                   onError(error)
               }
               else {
                   Hooks.defaultErrorHandler(callStack, error)
               }
               disposable.dispose()
           case .completed:
               onCompleted?()
               disposable.dispose()
           }
       }
       return Disposables.create(
           self.asObservable().subscribe(observer),
           disposable
       )
}

代码分析 我们重点关注我们相关的onNext,onError,onCompleted的调用

重点分析 这里我们看到了,创建了一个观察者observer,这个观察者是AnonymousObserver的观察者,这个观察者的构造是用过尾随闭包将以上的onNext``onError``onCompleted传入的,其实现如下

再看我们的subscribe的实现中,在最后返回时调用的是

return Disposables.create(self.asObservable().subscribe(observer),disposable)

可知调用的逻辑就是

let result = self.asObservable().subscribe(observer) //这里是真正的调用observer中的闭包
return Disposables.create(result,disposable)

我们的self序列化后又订阅了一个本地的observer,这个observer包含我们外部订阅的相关信息,这次的订阅的会触发我们上边Mark的位置,即会触发subscribeself.run运行,会调用AnonymousObservable中的run 代码如下

override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
        let sink = AnonymousObservableSink(observer: observer, cancel: cancel)
        let subscription = sink.run(self)
        return (sink: sink, subscription: subscription)
}

这个run操作就会触发我们原来生成序列时候保存的_subscribeHandler 至此,我们找到了具体的启动位置,此处应该给自己鼓个掌“👏👏👏👏”


画一个时序图