美文网首页
RXSwift - 链接 operator publish、m

RXSwift - 链接 operator publish、m

作者: 内蒙小猿 | 来源:发表于2020-08-23 06:11 被阅读0次

默认情况下不同的订阅者这不共享 Observable,不同的订阅者订阅的,是自己的 Observable 。如果想共享 Observable 就需要以下的 connectable operator。

Publish 发布共享 Observable

        let  interval = Observable<Int>.interval(DispatchTimeInterval.seconds(1), scheduler: MainScheduler.instance).publish()
        
        _ = interval.subscribe(onNext: { (num) in
            print("Subscriber1: \(num)")
        })
        
        _ = interval.connect()
        
        DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + 2) {
            _ = interval.subscribe(onNext: { (num) in
                print("Subscriber2: \(num)")
            })
        }

执行过程


interval
-----------------0-------1--------2-------3-------4-------5-------6--------------
 
Subscriber1
-----------------0-------1--------2-------3-------4-------5-------6--------------
 
Subscriber2
----------------------------------2--------3------4-------5-------6-------------
 
                                            ....publish()
     
----------------0---------1-----(2,2)---(3,4)----(4,4)----(5,5)----(6,6)----------

\color{#DEB887}{执行结果:}
\color{#DEB887}{Subscriber 1: 0}

\color{#DEB887}{Subscriber 1: 1}

\color{#DEB887}{Subscriber 1: 2}
\color{#DEB887}{Subscriber 2: 2}

note

  • 一、在 next(0) 的时候 Subscriber 1 开始监听 。

  • 二、因为 Subscriber 2 延时 两秒,所以在 next(1) Subscriber 2 没有监听到,只有Subscriber 1 监听。

  • 三、在第三秒开始 Subscriber 2 也加入监听,所以结果都是 next(2)。(因为 Publish 共享了 observable 所以 结果都是 next(2)。不如没有用 Publish 共享,Subscriber 1 监听的是 next(2),而 Subscriber 2 监听的是 next(0)

multicast 共享并监管 observable


        let supervisor = PublishSubject<Int>()
        
        let  interval = Observable<Int>.interval(DispatchTimeInterval.seconds(1), scheduler: MainScheduler.instance).multicast(supervisor)
        
        _ = supervisor.subscribe(onNext: { (num) in
            print("supervisor: \(num)")
        })
        
        _ = interval.subscribe(onNext: { (num) in
            print("     Subscriber1: \(num)")
        })
        
        _ = interval.connect()
        
        let current = DispatchTime.now()
        
        DispatchQueue.global().asyncAfter(deadline: current + 2) {
            _ = interval.subscribe(onNext: { (num) in
                print("     Subscriber2: \(num)")
            })
        }
        
        DispatchQueue.global().asyncAfter(deadline: current + 4) {
            _ = interval.subscribe(onNext: { (num) in
                print("     Subscriber3: \(num)")
            })
        }

执行过程

interval
-----------------0-------------1--------------2-------------3-------------4-----------------
     
supervisor
-----------------0-------------1--------------2-------------3-------------4-----------------
     
 
Subscriber1
-----------------0-------------1--------------2-------------3-------------4-----------------
 
Subscriber2
----------------------------------------------2--------------3-------------4-----------------
     
Subscriber2
--------------------------------------------------------------------------4-----------------
 
                              .....multicast(supervisor)
     
----------------(0,0)--------(1,1)----------(2,2,2)--------(3,3,3)-------(4,4,4,4)--------------

\color{#DEB887}{执行结果(前五秒):}
\color{#DEB887}{supervisor: 0 }
\color{#DEB887}{ \qquad Subscriber1: 0}

\color{#DEB887}{supervisor: 1 }
\color{#DEB887}{ \qquad Subscriber1: 1}

\color{#DEB887}{supervisor: 2 }
\color{#DEB887}{ \qquad Subscriber1: 2}
\color{#DEB887}{ \qquad Subscriber2: 2}

\color{#DEB887}{supervisor: 3 }
\color{#DEB887}{ \qquad Subscriber1: 3}
\color{#DEB887}{ \qquad Subscriber2: 3}

\color{#DEB887}{supervisor: 4 }
\color{#DEB887}{ \qquad Subscriber1: 4}
\color{#DEB887}{ \qquad Subscriber2: 4}
\color{#DEB887}{ \qquad Subscriber3: 4}

note

  • supervisor 存在于每组监听里,虽然在第二秒和第四秒 ,分别新加入了两个监听者。但是他们监听的observable 都是同一个。

相关文章

网友评论

      本文标题:RXSwift - 链接 operator publish、m

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