RxSwift_v1.0笔记——3 Subjects

作者: 大灰很 | 来源:发表于2017-07-16 18:51 被阅读66次

    RxSwift_v1.0笔记——3 Subjects

    Subject——可以看做是一种代理和桥梁。它既是订阅者又是订阅源,这意味着它既可以订阅其他 Observable 对象,同时又可以对它的订阅者们发送事件。

    开始 63

    与PublishSubjects工作 64

    当你订阅PublishSubject的时候,你只能接收到订阅他之后发生的事件

    开始是空并且仅仅发射新元素给订阅中。

    example(of: "PublishSubject") {
        let subject = PublishSubject<String>()
        subject.onNext("Is anyone listening?")
        
        let subscriptionOne = subject
            .subscribe(onNext: { string in
                print(string)
            })
        subject.on(.next("1"))
        subject.onNext("2")
        
        let subscriptionTwo = subject
            .subscribe { event in
                print("2)", event.element ?? event)
        }
        subject.onNext("3")
        subscriptionOne.dispose()
        subject.onNext("4")
        
        // 1
        subject.onCompleted()
        // 2
        subject.onNext("5")
        // 3
        subscriptionTwo.dispose()
        let disposeBag = DisposeBag()
        // 4
        subject
            .subscribe {
                print("3)", $0.element ?? $0)
            }
            .addDisposableTo(disposeBag)
        subject.onNext("?")
    }
    --- Example of: PublishSubject ---
    1
    2
    3
    2) 3
    2) 4
    2) completed
    3) completed
    

    与BehaviorSubjects工作 67

    在新的订阅对象订阅的时候会发送最近发送的事件,如果没有则发送一个默认值。

    开始有一个初始值,并且重复发送它(如果没有新元素)或发射最新的元素给订阅中。

    // 1
    enum MyError: Error {
        case anError
    }
    // 2
    func print<T: CustomStringConvertible>(label: String, event: Event<T>) {
        print(label, event.element ?? event.error ?? event)
    }
    // 3
    example(of: "BehaviorSubject") {
        // 4
        let subject = BehaviorSubject(value: "Initial value")
        let disposeBag = DisposeBag()
        subject
            .subscribe {
                print(label: "1)", event: $0)
            }
            .addDisposableTo(disposeBag)
        subject.onNext("X")
        // 1
        subject.onError(MyError.anError)
        // 2
        subject
            .subscribe {
                print(label: "2)", event: $0)
            }
            .addDisposableTo(disposeBag)
    }
    --- Example of: BehaviorSubject ---
    1) Initial value
    1) X
    1) anError
    2) anError
    

    与ReplaySubject工作 69

    在新的订阅对象订阅的时候会补发所有已经发送过的数据队列, bufferSize 是缓冲区的大小,决定了补发队列的最大值。如果 bufferSize 是1,那么新的订阅者出现的时候就会补发上一个事件,如果是2,则补两个,以此类推。

    使用缓冲区大小初始化,将保持元素的缓冲区达到该大小,并将其重新发送它给新的订阅着。

    example(of: "ReplaySubject") {
        // 1
        let subject = ReplaySubject<String>.create(bufferSize: 2)
        let disposeBag = DisposeBag()
        // 2
        subject.onNext("1")
        subject.onNext("2")
        subject.onNext("3")
        // 3
        subject
            .subscribe {
                print(label: "1)", event: $0)
            }
            .addDisposableTo(disposeBag)
        subject
            .subscribe {
                print(label: "2)", event: $0)
            }
            .addDisposableTo(disposeBag)
        subject.onNext("4")
        subject.onError(MyError.anError)
        subject.dispose()
        subject
            .subscribe {
                print(label: "3)", event: $0)
            }
            .addDisposableTo(disposeBag)
    }
    --- Example of: ReplaySubject ---
    1) 2
    1) 3
    2) 2
    2) 3
    1) 4
    2) 4
    1) anError
    2) anError
    3) Object `RxSwift.(ReplayMany in _33052C2CE59F358A8740AFDD4371DD39)<Swift.String>` was already disposed.
    

    与Variable工作 72

    是基于 BehaviorSubject 的一层封装,它的优势是:不会被显式终结。即:不会收到 .Completed 和 .Error 这类的终结事件,它会主动在析构的时候发送 .Complete 。需要调用它自带的asObservable()方法进行转化后才能被订阅。

    example(of: "Variable") {
        // 1
        var variable = Variable("Initial value")
        let disposeBag = DisposeBag()
        // 2
        variable.value = "New initial value"
        // 3
        variable.asObservable()
            .subscribe {
                print(label: "1)", event: $0)
            }
    //        .addDisposableTo(disposeBag)
        // 1
        variable.value = "1"
        // 2
        variable.asObservable()
            .subscribe {
                print(label: "2)", event: $0)
            }
            .addDisposableTo(disposeBag)
        // 3
        variable.value = "2"
    }
    --- Example of: Variable ---
    1) New initial value
    1) 1
    2) 1
    1) 2
    2) 2
    1) completed
    

    相关文章

      网友评论

      • b59457960ac9:PublishSubjects的代码,最后一个打印出来的不应该是"3) ?" 吗?怎么是3) complete呢?
        b59457960ac9:@大灰很 恩,忽略了这种情况了,谢谢指点
        大灰很:@Twistar 因为在//1那里subject 已经完成了,之后的订阅只会接收到完成

      本文标题:RxSwift_v1.0笔记——3 Subjects

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