iPhone应用开发

RXSwift Share 共享附加作用的理解

2019-09-26  本文已影响0人  请输入昵称Arthas

不多说,先贴上一段代码,来个案例分析

不想看代码的,直接往下拉看结果也可以明白个7788

    let disposeBag = DisposeBag()
    func shareTest(){
        
        //随便创建一个对象,目的是为了方便观察对象的内存地址
        class UserModel{
            var age:Int
            init(age:Int) {
                self.age = age
            }
        }
        
        //这里创建数组的作用是为了引用不让对象在ARC机制下提前释放
        var array:[UserModel] = Array()
        //创建一个普通的Subject
        let seq = PublishSubject<Int>()
        let a = seq.map { (i) -> UserModel in
            print("映射---\(i)")
            return UserModel(age: i)
        }
//        .share(replay: 1, scope: .whileConnected)//注意这行是注释了的
        
        a.subscribe(onNext: { (num) in
            
            print("第一次订阅--",Unmanaged.passUnretained(num).toOpaque())
            array.append(num)
        }).disposed(by: disposeBag)
        
        seq.onNext(1)
        seq.onNext(2)
        
        a.subscribe(onNext: { (num) in
            print("第二次订阅--",Unmanaged.passUnretained(num).toOpaque())
            array.append(num)
        }).disposed(by: disposeBag)
        
        seq.onNext(3)
        seq.onNext(4)
        
        a.subscribe(onNext: { (num) in
            print("第三次订阅--",Unmanaged.passUnretained(num).toOpaque())
            array.append(num)
        }).disposed(by: disposeBag)
        print(array)
        seq.onCompleted()
        
    }

1、下面是没有Share操作符的输出结果

映射---1
第一次订阅-- 0x0000600000729640
映射---2
第一次订阅-- 0x000060000072b3c0
映射---3
第一次订阅-- 0x000060000072a6a0
映射---3
第二次订阅-- 0x00006000007298e0
映射---4
第一次订阅-- 0x000060000072a620
映射---4
第二次订阅-- 0x000060000072b380

结论:每个订阅者接收到信号都要执行映射代码一次。这就是不共享附加作用

2、下面是有Share的操作符的输出结果(将上面的注释代码放开)

映射---1
第一次订阅-- 0x0000600003b85fa0
映射---2
第一次订阅-- 0x0000600003b87380
第二次订阅-- 0x0000600003b87380
映射---3
第一次订阅-- 0x0000600003b869e0
第二次订阅-- 0x0000600003b869e0
映射---4
第一次订阅-- 0x0000600003b87200
第二次订阅-- 0x0000600003b87200
第三次订阅-- 0x0000600003b87200

结论:一个信号不管有多少个订阅者,映射代码只执行一次。这就是共享附加作用

分析结论

1、从不共享结果可以看到,每个输出对象的地址都是不同的。就足可以证明了,所有的订阅者对同一个信号处理都是开辟新的资源。
2、从共享结果可以看到,所有的订阅者对同一个信号处理是共享同一个结果的。

用法:看明白分析结论,你就知道什么场景用Share,什么时候不用了吧。

上一篇 下一篇

猜你喜欢

热点阅读