RxSwift官方使用示例之<创建和订阅Observables>

avatar
iOS 开发工程师 @抖音视界有限公司

本文是示例主要来自于官方的实例代码,可从这里下载 ,实例代码稍有改动。其中的图片来自于reactivex.io/

本文主要的作用是查看实例代码并查看对应实例代码的效果,不需要运行项目

操作符目录

debug 操作符会打印所有的 subscriptions, events, disposals

never

示例

创建一个永不终止且永不发出任何事件的序列

image.png

let disposeBag = DisposeBag()
let neverSequence = Observable<String>.never()

let neverSequenceSubscription = neverSequence
    .subscribe { _ in
        print("不可能进入这里")
}
neverSequenceSubscription.disposed(by: disposeBag)

无打印

核心源码分析

extension ObservableType {
    static func never() -> Observable<Element> {
        NeverProducer()
    }
}
private final class NeverProducer<Element>: Producer<Element> {
    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {
        // `subscribe` 方法什么也没做,只返回了一个 `Disposable`,所以 不可能执行订阅的代码
        Disposables.create()
    }
}

empty

示例

创建一个只发出 Completed 事件的 Observable 序列

image.png

let disposeBag = DisposeBag()
    
Observable<Int>.empty()
    .subscribe { event in
        print(event)
    }
    .disposed(by: disposeBag)

打印

completed

核心源码分析

extension ObservableType {
    static func empty() -> Observable<Element> {
        EmptyProducer()
    }
}
private final class EmptyProducer<Element>: Producer<Element> {
    override func subscribe<Observer>(_ observer: Observer) -> Disposable where Element == Observer.Element, Observer : ObserverType {
        // 此处只发送了一个Complete事件
        observer.onCompleted()
        return Disposables.create()
    }
}

just

示例

创建一个发送一个元素的 Observable 序列

image.png

let disposeBag = DisposeBag()
        
Observable.just("🔴")
    .subscribe { event in
        print(event)
    }
    .disposed(by: disposeBag)

打印

next(🔴)
completed

核心源码分析1:无 ImmediateSchedulerType

extension ObservableType {
    static func just(_ element: Element) -> Observable<Element> {
        Just(element)
    }
}
private final class Just<Element>: Producer<Element> {
    private let element: Element
    init(_ element: Element) {
        // 保存外面传来的元素
        self.element = element
    }
    override func subscribe<Observer>(_ observer: Observer) -> Disposable where Element == Observer.Element, Observer : ObserverType {
        // 一次性发送外面传来的元素,并立即结束
        observer.onNext(element)
        observer.onCompleted()
        
        return Disposables.create()
    }
}

核心源码分析2:有 ImmediateSchedulerType

extension ObservableType {
    static func just(_ element: Element, scheduler: ImmediateSchedulerType) -> Observable<Element> {
        JustScheduled(element, scheduler: scheduler)
    }
}
// 这个类不用太过关注,可以认为是中间传参用的中间层,实际操作都在 Sink 里
// 这里实际是调用父类 Producer 的 subscribe 后会执行到 run 方法中,主要逻辑都在 run 方法中
// 而 run 方法的主要逻辑是:1 传递参数;2 调用 Sink 的 run 方法
private final class JustScheduled<Element>: Producer<Element> {
    fileprivate let scheduler: ImmediateSchedulerType
    fileprivate let element: Element
    
    init(_ element: Element, scheduler: ImmediateSchedulerType) {
        self.scheduler = scheduler
        self.element = element
    }
    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Element == Observer.Element {
        // 1. 传参
        let sink = JustScheduledSink(parent: self, observer: observer, cancel: cancel)
        // 2. 调用 run
        let subscription = sink.run()
        return (sink, subscription)
    }
}

private final class JustScheduledSink<Observer: ObserverType>: Sink<Observer> {
    typealias Parent = JustScheduled<Observer.Element>
    private let parent: Parent
    // 传参
    init(parent: Parent, observer: Observer, cancel: Cancelable) {
        self.parent = parent
        super.init(observer: observer, cancel: cancel)
    }
    
    func run() -> Disposable {
        let scheduler = parent.scheduler
        return scheduler.schedule(parent.element) { element in
            // 1 一次性发送 element 元素
            self.forwardOn(.next(element))
            return scheduler.schedule(()) { _ in
                // 2. 发送 complete 事件
                self.forwardOn(.completed)
                self.dispose()
                return Disposables.create()
            }
        }
    }
}

补充一下 Producer 源码

// 注意很重要:
// Producer 是一个 Observable,也就是说它可以发送各种事件,可以 subscribe
// RxSwift 中有很多类继承自 Producer,他们都可以发送各种事件,可以 subscribe
class Producer<Element>: Observable<Element> {
    override init() {
        super.init()
    }
    
    private func sinkDisposer<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {
        let disposer = SinkDisposer()
        // 调用子类的 run 方法
        let sinkAndSubscription = run(observer, cancel: disposer)
        disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription)
        return disposer
    }
    
    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {
        if CurrentThreadScheduler.isScheduleRequired {
            // 1. 先执行这里
            // schedule 内部会立即执行 sinkDisposer 方法
            // 并取出当前线程中的任务去执行
            return CurrentThreadScheduler.instance.schedule(()) { _ in
                return self.sinkDisposer(observer)
            }
        } else {
            // 2. 之后再执行这里
            return sinkDisposer(observer)
        }
    }
    // 子类要实现的 run 方法
    func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {
        rxAbstractMethod()
    }
}

of

示例

创建一个有固定数目元素的 Observable 序列

let disposeBag = DisposeBag()

Observable.of("🐶", "🐱", "🐭", "🐹")
    .subscribe(onNext: { element in
        print(element)
    })
    .disposed(by: disposeBag)

打印

🐶
🐱
🐭
🐹

核心源码分析,主要代码在 ObservableSequenceSink.run

extension Observable {
    static func of(_ elements: Element..., scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element> {
        ObservableSequence(elements: elements, scheduler: scheduler)
    }
}
private final class ObservableSequence<Sequence: Swift.Sequence>: Producer<Sequence.Element> {
    fileprivate let elements: Sequence
    fileprivate let scheduler: ImmediateSchedulerType
    
    init(elements: Sequence, scheduler: ImmediateSchedulerType) {
        self.elements = elements
        self.scheduler = scheduler
    }
    
    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Sequence.Element == Observer.Element {
        let sink = ObservableSequenceSink(parent: self, observer: observer, cancel: cancel)
        let subscription = sink.run()
        return (sink, subscription)
    }
}
private final class ObservableSequenceSink<Sequence: Swift.Sequence, Observer: ObserverType>: Sink<Observer> where Sequence.Element == Observer.Element {
    typealias Parent = ObservableSequence<Sequence>
    private let parent: Parent
    
    init(parent: Parent, observer: Observer, cancel: Cancelable) {
        self.parent = parent
        super.init(observer: observer, cancel: cancel)
    }
    
    func run() -> Disposable {
        // 递归调用列表中的所有元素,一个个发送出去,直到 complete
        parent.scheduler.scheduleRecursive(parent.elements.makeIterator()) { iterator, recurse in
            var mutableIterator = iterator
            if let element = mutableIterator.next() {
                self.forwardOn(.next(element))
                // 递归调用
                recurse(mutableIterator)
            } else {
                self.forwardOn(.completed)
                self.dispose()
            }
        }
    }
}

from

示例

从Array、Dictionary、Set等序列创建一个 Observable 序列

image.png

let disposeBag = DisposeBag()

Observable.from(["🐶", "🐱", "🐭", "🐹"])
    .subscribe(onNext: { element in
        print(element)
    })
    .disposed(by: disposeBag)

Observable.from(["A": 1, "B", 2])
    .subscribe(onNext: { element in
        print(element)
    })
    .disposed(by: disposeBag)

打印

🐶
🐱
🐭
🐹
(key: "A", value: 1)
(key: "B", value: 2)

核心源码与 of 基本一样

create

示例

创建一个自定义的 Observable 序列

image.png

let disposeBag = DisposeBag()
        
Observable<String>.create { observer in
    observer.on(.next("A"))
    observer.on(.next("B"))
    observer.on(.next("C"))
    observer.on(.completed)
    return Disposables.create()
}
.subscribe { print($0) }
.disposed(by: disposeBag)

打印

next(A)
next(B)
next(C)
completed

核心源码

extension ObservableType {
    static func create(_ subscribe: @escaping (AnyObserver<Element>) -> Disposable) -> Observable<Element> {
        AnonymousObservable(subscribe)
    }
}

private final class AnonymousObservableSink<Observer: ObserverType>: Sink<Observer>, ObserverType {
    typealias Element = Observer.Element
    typealias Parent = AnonymousObservable<Element>
    
    private let isStoped = AtomicInt(0)
    
    override init(observer: Observer, cancel: Cancelable) {
        super.init(observer: observer, cancel: cancel)
    }
    
    // 4. create 中的 observer.on 方法就是这个方法
    func on(_ event: Event<Observer.Element>) {
        switch event {
        case .next:
            if load(isStoped) == 1 {
                return
            }
            // 5. 给订阅者发送时间
            forwardOn(event)
        case .error, .completed:
            if fetchOr(isStoped, 1) == 0 {
                // 5. 给订阅者发送时间
                forwardOn(event)
                dispose()
            }
        }
    }
    
    // 3. 执行 run 方法,内部就是执行传进来的闭包
    // 把自己包装成一个 AnyObserver,这个 observer 就是 create 闭包中的 observer 参数
    func run(_ parent: Parent) -> Disposable {
        parent.subscribeHandler(AnyObserver(self))
    }
}

private final class AnonymousObservable<Element>: Producer<Element> {
    typealias SubscribeHandler = (AnyObserver<Element>) -> Disposable
    let subscribeHandler: SubscribeHandler
    
    init(_ subscribeHandler: @escaping SubscribeHandler) {
        // 1. 外面传进来的闭包
        self.subscribeHandler = subscribeHandler
    }
    
    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Element == Observer.Element {
        let sink = AnonymousObservableSink(observer: observer, cancel: cancel)
        // 2. 在 subscribe 时会走到这里
        let subscription = sink.run(self)
        return (sink, subscription)
    }
}

range

示例

创建一个发出一系列连续整数后终止的 Observable 序列

image.png

let disposeBag = DisposeBag()
        
Observable.range(start: 1, count: 10)
    .subscribe { print($0) }
    .disposed(by: disposeBag)

打印

next(1)
next(2)
next(3)
next(4)
next(5)
next(6)
next(7)
next(8)
next(9)
next(10)
completed

核心源码

extension ObservableType where Element: RxAbstractInteger {
    static func range(start: Element, count: Element, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element> {
        RangeProducer(start: start, count: count, scheduler: scheduler)
    }
}
// 1. 这个类可以见到的理解为传递参数用以及方法中转用的,不用特别关注
private final class RangeProducer<Element: RxAbstractInteger>: Producer<Element> {
    fileprivate let start: Element
    fileprivate let count: Element
    fileprivate let scheduler: ImmediateSchedulerType
    
    init(start: Element, count: Element, scheduler: ImmediateSchedulerType) {
        guard count >= 0 else {
            rxFatalError("count can't be negative")
        }
        guard start &+ (count - 1) > start || count == 0 else {
            rxFatalError("overflow of count")
        }
        self.start = start
        self.count = count
        self.scheduler = scheduler
    }
    
    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Element == Observer.Element {
        let sink = RangeSink(parent: self, observer: observer, cancel: cancel)
        let subscription = sink.run()
        return (sink, subscription)
    }
}

private final class RangeSink<Observer: ObserverType>: Sink<Observer> where Observer.Element: RxAbstractInteger {
    typealias Parent = RangeProducer<Observer.Element>
    private let parent: Parent
    
    init(parent: Parent, observer: Observer, cancel: Cancelable) {
        self.parent = parent
        super.init(observer: observer, cancel: cancel)
    }
    // 2. subscribe 的时候执行的核心代码在这里
    func run() -> Disposable {
        parent.scheduler.scheduleRecursive(0 as Observer.Element) { i, recurse in
            // 3. 会递归的执行这里的代码,就是一个 类似 while 循环的逻辑
            if i < self.parent.count {
                self.forwardOn(.next(self.parent.start + i))
                // 4. 递归调用
                recurse(i + 1)
            } else {
                self.forwardOn(.completed)
                self.dispose()
            }
        }
    }
}

repeatElement

示例

创建一个无限期发射给定元素的 Observable 序列

image.png

let disposeBag = DisposeBag()
        
Observable.repeatElement("🔴")
    .take(3) // 只接收3个,注释的话会无限接收
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

打印

🔴
🔴
🔴

核心源码

extension ObservableType {
    static func repeatElement(_ element: Element, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element> {
        RepeatElement(element: element, scheduler: scheduler)
    }
}
// 1. 这个类可以见到的理解为传递参数用以及方法中转用的,不用特别关注
private final class RepeatElement<Element>: Producer<Element> {
    fileprivate let element: Element
    fileprivate let scheduler: ImmediateSchedulerType
    
    init(element: Element, scheduler: ImmediateSchedulerType) {
        self.element = element
        self.scheduler = scheduler
    }
    
    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Element == Observer.Element {
        let sink = RepeatSink(parent: self, observer: observer, cancel: cancel)
        let subscription = sink.run()
        return (sink, subscription)
    }
}

private final class RepeatSink<Observer: ObserverType>: Sink<Observer> {
    typealias Parent = RepeatElement<Observer.Element>
    private let parent: Parent
    
    init(parent: Parent, observer: Observer, cancel: Cancelable) {
        self.parent = parent
        super.init(observer: observer, cancel: cancel)
    }
    
    // 2. subscribe 的时候执行的核心代码在这里
    func run() -> Disposable {
        return parent.scheduler.scheduleRecursive(parent.element) { state, recurse in
            self.forwardOn(.next(state))
            // 3. 递归调用
            recurse(state)
        }
    }
}

generate

示例

创建一个根据条件生成值的 Observable 序列

let disposeBag = DisposeBag()
    
Observable.generate(
        initialState: 0,
        condition: { $0 < 3 },
        iterate: { $0 + 1 }
    )
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

打印

1
2
3

核心源码

extension ObservableType {
    static func generate(initialState: Element, condition: @escaping (Element) throws -> Bool, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance, iterate: @escaping (Element) throws -> Element) -> Observable<Element> {
        Generate(initialState: initialState, condition: condition, scheduler: scheduler, iterate: iterate)
    }
}
// 1. 这个类可以见到的理解为传递参数用以及方法中转用的,不用特别关注
private final class Generate<Element>: Producer<Element> {
    fileprivate let initialState: Element
    fileprivate let condition: (Element) throws -> Bool
    fileprivate let iterate: (Element) throws -> Element
    fileprivate let scheduler: ImmediateSchedulerType
    
    init(initialState: Element, condition: @escaping (Element) throws -> Bool, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance, iterate: @escaping (Element) throws -> Element) {
        self.initialState = initialState
        self.condition = condition
        self.iterate = iterate
        self.scheduler = scheduler
        super.init()
    }
    
    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Element == Observer.Element {
        let sink = GenerateSink(parent: self, observer: observer, cancel: cancel)
        let subscription = sink.run()
        return (sink, subscription)
    }
}

private final class GenerateSink<Observer: ObserverType>: Sink<Observer> {
    typealias Parent = Generate<Observer.Element>
    
    private let parent: Parent
    private var state: Observer.Element
    
    init(parent: Parent, observer: Observer, cancel: Cancelable) {
        self.parent = parent
        self.state = parent.initialState
        super.init(observer: observer, cancel: cancel)
    }
    // 2. subscribe 的时候执行的核心代码在这里
    func run() -> Disposable {
        parent.scheduler.scheduleRecursive(true) { isFirst, recurse in
            do {
                if !isFirst {
                    self.state = try self.parent.iterate(self.state)
                }
                // 3. 判断是否符合条件
                if try self.parent.condition(self.state) {
                    // 4. 生成需要的值
                    let result = try self.parent.iterate(self.state)
                    // 5. 发送生成的值
                    self.forwardOn(.next(result))
                    // 6. 递归
                    recurse(false)
                } else {
                    // 7. 不符合条件时结束
                    self.forwardOn(.completed)
                    self.dispose()
                }
            } catch {
                self.forwardOn(.error(error))
                self.dispose()
            }
        }
    }
}

deferred

示例

为每一个订阅者创建一个新的 Observable 序列

image.png

let disposeBag = DisposeBag()
var count = 1

let deferredSequence = Observable<String>.deferred {
    print("Creating \(count)")
    count += 1
    
    return Observable.create { observer in
        print("Emitting...")
        observer.onNext("🐶")
        observer.onNext("🐱")
        observer.onNext("🐵")
        return Disposables.create()
    }
}

deferredSequence
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

deferredSequence
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

打印

Creating 1
Emitting...
🐶
🐱
🐵
Creating 2
Emitting...
🐶
🐱
🐵

核心源码

extension ObservableType {
    static func deferred(_ observableFactory: @escaping () throws -> Observable<Element>) -> Observable<Element> {
        Deferred(observableFactory)
    }
}
// 1. 这个类可以见到的理解为传递参数用以及方法中转用的,不用特别关注
private final class Deferred<Source: ObservableType>: Producer<Source.Element> {
    typealias Factory = () throws -> Source
    
    fileprivate let observableFactory: Factory
    
    init(_ observableFactory: @escaping Factory) {
        self.observableFactory = observableFactory
    }
    
    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Source.Element == Observer.Element {
        let sink = DeferredSink(parent: self, observer: observer, cancel: cancel)
        let subscription = sink.run()
        return (sink, subscription)
    }
}

private final class DeferredSink<Source: ObservableType, Observer: ObserverType>: Sink<Observer>, ObserverType where Source.Element == Observer.Element {
    typealias Element = Observer.Element
    typealias Parent = Deferred<Source>
    private let parent: Parent
    
    init(parent: Parent, observer: Observer, cancel: Cancelable) {
        self.parent = parent
        super.init(observer: observer, cancel: cancel)
    }
    // 2. subscribe 的时候执行的核心代码在这里
    func run() -> Disposable {
        do {
            // 3. 生成一个新的 Observable
            let result = try parent.observableFactory()
            // 4. 新的 Observable 订阅自己
            return result.subscribe(self)
        } catch {
            forwardOn(.error(error))
            dispose()
            return Disposables.create()
        }
    }
    // 5. 有事件时,自己接收事件
    func on(_ event: Event<Element>) {
        // 6. 转发给真正的 订阅者
        forwardOn(event)
        switch event {
        case .next: break
        default: dispose()
        }
    }
}

error

示例

创建一个立即发送 errorObservable 序列

enum TestError: Error {
    case test
}
let disposeBag = DisposeBag()
        
Observable<Int>.error(TestError.test)
    .subscribe { print($0) }
    .disposed(by: disposeBag)

打印

error(test)

核心源码

extension ObservableType {
    static func error(_ error: Swift.Error) -> Observable<Element> {
        ErrorProducer(error: error)
    }
}

private final class ErrorProducer<Element>: Producer<Element> {
    private let error: Swift.Error
    
    init(error: Swift.Error) {
        self.error = error
    }
    
    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Element == Observer.Element {
        // 订阅时直接发送 error 事件
        observer.on(.error(error))
        return Disposables.create()
    }
}

doOn

示例

为每个发出的事件调用副作用操作并返回原始事件

image.png

let disposeBag = DisposeBag()
        
Observable.of("🍎", "🍐", "🍊", "🍋")
    .do(onNext: { print("Intercepted:", $0) }, afterNext: { print("Intercepted after:", $0) },
        onError: { print("Intercepted error:", $0) }, afterError: { print("Intercepted after error:", $0) },
        onCompleted: { print("Completed")  }, afterCompleted: { print("After completed")  })
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

打印

Intercepted: 🍎
🍎
Intercepted after: 🍎
Intercepted: 🍐
🍐
Intercepted after: 🍐
Intercepted: 🍊
🍊
Intercepted after: 🍊
Intercepted: 🍋
🍋
Intercepted after: 🍋
Completed
After completed