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、从共享结果可以看到,所有的订阅者对同一个信号处理是共享同一个结果的。