不多說拨拓,先貼上一段代碼,來個案例分析
不想看代碼的氓栈,直接往下拉看結(jié)果也可以明白個7788
let disposeBag = DisposeBag()
func shareTest(){
//隨便創(chuàng)建一個對象渣磷,目的是為了方便觀察對象的內(nèi)存地址
class UserModel{
var age:Int
init(age:Int) {
self.age = age
}
}
//這里創(chuàng)建數(shù)組的作用是為了引用不讓對象在ARC機制下提前釋放
var array:[UserModel] = Array()
//創(chuàng)建一個普通的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操作符的輸出結(jié)果
映射---1
第一次訂閱-- 0x0000600000729640
映射---2
第一次訂閱-- 0x000060000072b3c0
映射---3
第一次訂閱-- 0x000060000072a6a0
映射---3
第二次訂閱-- 0x00006000007298e0
映射---4
第一次訂閱-- 0x000060000072a620
映射---4
第二次訂閱-- 0x000060000072b380
結(jié)論:每個訂閱者接收到信號都要執(zhí)行映射代碼一次授瘦。這就是不共享附加作用
2醋界、下面是有Share的操作符的輸出結(jié)果(將上面的注釋代碼放開)
映射---1
第一次訂閱-- 0x0000600003b85fa0
映射---2
第一次訂閱-- 0x0000600003b87380
第二次訂閱-- 0x0000600003b87380
映射---3
第一次訂閱-- 0x0000600003b869e0
第二次訂閱-- 0x0000600003b869e0
映射---4
第一次訂閱-- 0x0000600003b87200
第二次訂閱-- 0x0000600003b87200
第三次訂閱-- 0x0000600003b87200
結(jié)論:一個信號不管有多少個訂閱者,映射代碼只執(zhí)行一次提完。這就是共享附加作用
分析結(jié)論
1形纺、從不共享結(jié)果可以看到,每個輸出對象的地址都是不同的徒欣。就足可以證明了逐样,所有的訂閱者對同一個信號處理都是開辟新的資源。
2、從共享結(jié)果可以看到脂新,所有的訂閱者對同一個信號處理是共享同一個結(jié)果的秽澳。