RxSwift 中的subject

版权声明:转载请标注原文地址。邮箱[email protected] https://blog.csdn.net/Xoxo_x/article/details/80808431

可以同时作为 observableobserver 称为 subject
常见的subject有以下几种:
1.PublishSubject 执行的是会员制 只会把消息发送给消息之前的订阅者,一旦取消订阅,则不发送
2.BehaviorSubject 试用制度,没有发生事件时 给订阅者默认发送的内容 当事件已经发生过一次,当订阅时没有发生时间,返回最近的一次的历史事件
3.ReplaySubject 可控制发送给订阅者历史事件的范围
4.Variable 需要某个值需要有响应式特性的 比如:按钮是否禁用,是否显示某个控件

使用方法:

PublishSubject

 //PublishSubject
        let subject = PublishSubject<String>()//泛型参数,表示可以订阅到的 以及可以发布到的类型



        //subject 当做observable 的时候
        let sub1 = subject.subscribe(
            onNext:{print("aa",$0)}
        )

        //subject 当做observer 的时候
        subject.onNext("1")
        sub1.dispose()//取消订阅

        //PublishSubject 执行的是会员制 只会把消息发送给消息之前的订阅者,一旦取消订阅,则不发送

        let sub2 = subject.subscribe(
            onNext:{print("bb",$0)}
        )
        subject.onNext("2")
        subject.onNext("3")

        sub2.dispose()//取消订阅

        subject.onNext("4")

BehaviorSubject

//从会员制 变成 试用制
        let subject = BehaviorSubject<String>(value: "RxSwift step by step")
        //value 表示没有发生事件时 给订阅者默认发送的内容 当事件已经发生过一次,当订阅时没有发生时间,返回最近的一次的历史事件
        let sub1 = subject.subscribe(
            onNext:{print("aa",$0)}
        )
        subject.onNext("1")
        sub1.dispose()//取消订阅

        let sub2 = subject.subscribe(
            onNext:{print("bb",$0)}
        )
        subject.onNext("2")
        subject.onNext("3")

        sub2.dispose()//取消订阅

        subject.onNext("4")

ReplaySubject

let subject = ReplaySubject<String>.create(bufferSize: 2)
        //控制发送给订阅者历史事件的范围
        //订阅空的subject不会受到任何消息,这一点和PublishSubject非常相似
        //其次,它自带一个缓冲区,当有人订阅他的时候,会发送缓冲区指定数量的历史事件


        subject.onNext("2")
        subject.onNext("3")
        let sub1 = subject.subscribe(
            onNext:{print("aa",$0)}
        )
        subject.onNext("4")
        sub1.dispose()
        let sub2 = subject.subscribe(
            onNext:{print("aa",$0)}
        )
        sub2.dispose()

Variable

 //声明
        let stringVariable = Variable.init("epɪsəʊd")

        //最为被订阅者
        let sub1 = stringVariable.asObservable().subscribe({print($0)})

        stringVariable.value = "123"
        print(stringVariable.value)
        //绝对不会onError
        //每一次都是onNext 之后自动调用onCompleted 所有不能手动发送onCompleted事件表示事件,否则会导致编译错误
    }

猜你喜欢

转载自blog.csdn.net/Xoxo_x/article/details/80808431