响应式编程和RxSwift的核心思想

你好,我是Emma,说到swift中的响应式编程框架,比较典型的就是RxSwift,RxSwift的功用,我们可以类比OC中的RAC。

1.函数式编程(FRP)function reactive programe

函数式编程是种编程范式,它需要我们将函数作为参数传递,或者作为返回值返还。y = f(x) x = f(x) -> y = f(f(x))

2.函数式编程的一个实现场景:

一方响应,另一方也跟着响应。

3.响应式框架实现思路:

响应式框架,它指的是能够支持响应式编程范式的框架。使用了响应式框架,你在编程时就可以使用数据流传播数据的变化,响应这个数据流的计算模型会自动计算出新的值,将新的值通过数据流传给下一个响应的计算模型,如此反复下去,直到没有响应者为止。

KVO如何实现其响应式编程的?思路:对值进行监听,当一方值变化的时候,我们可以监听到,然后产生反应。

Tips:
KVO的使用来自于OC中的运行时机制,而swift是一门静态语言,我们要使用运行时编译的话,得加上@objc。

RxSwift是如何实现响应式编程的?
思想:创建序列+订阅+回收

4.rx是如何封装的?

rx,匿名空间,rx相当于OC中的NSObject,协议扩展

协议最基本的属性是扩展功能。
关联属性,关联值,遵守这个协议的人都有关联的功能。

5.RxSwift实现响应式编程详解

5.1代码总览

1.创建序列

let ob = Observable.create { (obserber) -> Disposable in  
    // 3:订阅中心发送信号  
    obserber.onNext("框架班级")  
    obserber.onCompleted()  
   //  obserber.onError(NSError.init(domain: "coocieeror", code: 10087, userInfo: nil))  
    return Disposables.create()  
}  

2.订阅信号

let _ = ob.subscribe(onNext: { (text) in  
    print("订阅到:\(text)")  
}, onError: { (error) in  
    print("error: \(error)")  
}, onCompleted: {  
    print("完成")  
}) {  
    print("销毁")  
}  

5.2代码问题

看着上面代码的使用方式,我们进行一下思考:

5.2.1obserber.onNext("框架班级")代码是怎么产生的?

类比RAC,控件的事件响应的是Rx的内部类,而内部类中响应sendNext的方法。

5.2.2序列中发送了信号,那在订阅中是如何订阅到的呢?

1)创建部分:

create通过一个构建函数完整的创建一个 Observable(可监听序列)。
使用上:

在构建函数里面描述事件(next,error,completed)的产生过程。
源码分析上:

- parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.我的理解是:可监听序列的“subscribe”方法的实现
- returns: The observable sequence with the specified implementation for the `subscribe` method.具有指定的'subscribe'方法实现的可观察序列。
public static func create(_ subscribe: @escaping (AnyObserver) -> Disposable) -> Observable {  
    return AnonymousObservable(subscribe)  
}   

AnonymousObservable的初始化方法中保存了传过来的闭包。

final private class AnonymousObservable: Producer {
    typealias SubscribeHandler = (AnyObserver) -> Disposable

    let _subscribeHandler: SubscribeHandler

    init(_ subscribeHandler: @escaping SubscribeHandler) {
        self._subscribeHandler = subscribeHandler
    }

    override func run(_ 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)
    }
}

AnonymousObservableSink点击进来的这段初始化了可监听序列,并且对(next,error,completed)也进行了初始化。

override init(observer: O, cancel: Cancelable) {  
    super.init(observer: observer, cancel: cancel)  
}  
func on(_ event: Event) {  
    #if DEBUG  
        self._synchronizationTracker.register(synchronizationErrorMessage: .default)  
        defer { self._synchronizationTracker.unregister() }  
    #endif  
    switch event {  
    case .next:  
        if load(self._isStopped) == 1 {  
            return  
        }  
        self.forwardOn(event)  
    case .error, .completed:  
        if fetchOr(self._isStopped, 1) == 0 {  
            self.forwardOn(event)  
            self.dispose()  
        }  
    }  
}  

2)订阅部分

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.  

创建了一个序列监听类AnonymousObserver,并保存了事件的回调。
回调里面根据不同的事件类型,来执行相应的事件。

let observer = AnonymousObserver { 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()  
    }  
}  

然后用资源管理器Disposables将可监听序列(observable)和序列监听者(observer)关联起来:

return Disposables.create(
  self.asObservable().subscribe(observer),
                disposable
)
5.2.3资源管理器Disposables将可监听序列(observable)和序列监听者(observer)关联起来的?

subscribe--->create中

class Producer : Observable {
    override init() {
        super.init()
    }

    override func subscribe(_ observer: O) -> Disposable where O.E == Element {
        if !CurrentThreadScheduler.isScheduleRequired {
            // The returned disposable needs to release all references once it was disposed.
            let disposer = SinkDisposer()
            let sinkAndSubscription = self.run(observer, cancel: disposer)
            disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription)

            return disposer
        }
        else {
            return CurrentThreadScheduler.instance.schedule(()) { _ in
                let disposer = SinkDisposer()
                let sinkAndSubscription = self.run(observer, cancel: disposer)
                disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription)

                return disposer
            }
        }
    }

    func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
        rxAbstractMethod()
    }
}

这里是sink和subscription等变量的存储和初始化

    func setSinkAndSubscription(sink: Disposable, subscription: Disposable) {
        self._sink = sink
        self._subscription = subscription

        let previousState = fetchOr(self._state, DisposeState.sinkAndSubscriptionSet.rawValue)
        if (previousState & DisposeState.sinkAndSubscriptionSet.rawValue) != 0 {
            rxFatalError("Sink and subscription were already set")
        }

        if (previousState & DisposeState.disposed.rawValue) != 0 {
            sink.dispose()
            subscription.dispose()
            self._sink = nil
            self._subscription = nil
        }
    }

而外部onnext变化是具体:

final private class AnonymousObservableSink: Sink, ObserverType {
    typealias E = O.E
    typealias Parent = AnonymousObservable

    // state
    private let _isStopped = AtomicInt(0)

    #if DEBUG
        fileprivate let _synchronizationTracker = SynchronizationTracker()
    #endif

    override init(observer: O, cancel: Cancelable) {
        super.init(observer: observer, cancel: cancel)
    }

    func on(_ event: Event) {
        #if DEBUG
            self._synchronizationTracker.register(synchronizationErrorMessage: .default)
            defer { self._synchronizationTracker.unregister() }
        #endif
        switch event {
        case .next:
            if load(self._isStopped) == 1 {
                return
            }
            self.forwardOn(event)
        case .error, .completed:
            if fetchOr(self._isStopped, 1) == 0 {
                self.forwardOn(event)
                self.dispose()
            }
        }
    }

    func run(_ parent: Parent) -> Disposable {
        return parent._subscribeHandler(AnyObserver(self))
    }
}

在AnonymousObservable类调用subscribe调用时,实际上是创建了一个sink对象。在sink调用我们保存的闭包的时候,也把闭包内的onNext方法方法作为event事件保存起来。并在调用observer对象时,把event做为参数传了进来。AnonymousObserver和AnonymousObservableSink这样就关联在一起了,然后对里面的event进行(next,error,completed)的分发。

总结:

核心思想:创建序列-》订阅序列-》事件关联。

参考资料:

RxSwift 中文文档
RxSwift Github地址

你可能感兴趣的:(响应式编程和RxSwift的核心思想)