[RxSwift] Subject

kimdocs...๐Ÿ“„ยท2021๋…„ 5์›” 5์ผ
1

๐ŸงพSubject๋ž€?

observable์€ unicast ๋ฐฉ์‹
subject๋Š” multicast ๋ฐฉ์‹์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ observer๋ฅผ subscribeํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Subject์˜ ์ข…๋ฅ˜

Publish Subject

๊ตฌ๋…ํ•œ ๋’ค์— Observable์ด ๋ณด๋‚ธ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌ๋ฐ›์Šต๋‹ˆ๋‹ค.

element ์—†์ด ๋นˆ ์ƒํƒœ๋กœ ์ƒ์„ฑ๋˜๊ณ , subscribeํ•œ ์‹œ์  ์ดํ›„์— ๋ฐœ์ƒ๋˜๋Š” ์ด๋ฒคํŠธ๋งŒ ์ „๋‹ฌ๋ฐ›์•„์š”.

let disposeBag = DisposeBag()
let subject = PublishSubject<String>()

subject.onNext("Hi")

let o1 = subject.subscribe {print (">>1",$0)}
o1.disposed(by: disposeBag)

subject.onNext("a")
subject.onNext("b")

let o2 = subject.subscribe{print(">>2",$0)}
o2.disposed(by: disposeBag)

subject.onNext("c")
subject.onNext("d")

์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š”?

>>1 next(a)
>>1 next(b)
>>1 next(c)
>>2 next(c)
>>1 next(d)
>>2 next(d)

o1์˜ ๊ตฌ๋… ์‹œ์  ์ด์ „์— ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ์ธ Hi์™€

o2์˜ ๊ตฌ๋… ์‹œ์  ์ด์ „์— ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ์ธ Hi,a,b์— ๋Œ€ํ•ด์„œ๋Š” ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”!

Behavior Subject

๊ตฌ๋… ํ›„์— ๋ฐœ์ƒํ•œ ์‹œ์  ์ด์ „์— ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ ์ค‘ ๊ฐ€์žฅ ์ตœ์‹ ์˜ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌ๋ฐ›์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ƒ์„ฑ๋œ๋‹ค๋Š” ์ ์ด Behavior Subject ๋งŒ์˜ ํŠน์ง•์ด์—์š”!

let disposeBag = DisposeBag()
let subject = BehaviorSubject<String>(value: "start") //observer

subject.onNext("Hi")

let o1 = subject.subscribe {print (">>1",$0)}
o1.disposed(by: disposeBag)

subject.onNext("a")
subject.onNext("b")

let o2 = subject.subscribe{print(">>2",$0)}
o2.disposed(by: disposeBag)

subject.onNext("c")
subject.onNext("d")

์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š”?

>>1 next(Hi)
>>1 next(a)
>>1 next(b)
>>2 next(b)
>>1 next(c)
>>2 next(c)
>>1 next(d)
>>2 next(d)

o1 ๊ธฐ์ค€ ๊ฐ€์žฅ ์ตœ์‹ ์˜ ์ด๋ฒคํŠธ์ธ Hi์™€

o2 ๊ธฐ์ค€ ๊ฐ€์žฅ ์ตœ์‹ ์˜ ์ด๋ฒคํŠธ์ธ b๊ฐ€ ์ „๋‹ฌ๋˜์–ด ๋‚˜์˜ค๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”

Replay Subject

๊ตฌ๋… ์ „์— ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋ฒ„ํผ์— ๋„ฃ๊ณ , ๋ฒ„ํผ์— ๋“ค์–ด์žˆ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•ด์š”.

๋ฏธ๋ฆฌ ์‚ฌ์ด์ฆˆ๋ฅผ ์ •ํ•ด์ค˜์•ผํ•˜๊ณ , ๋ฒ„ํผ ์‚ฌ์ด์ฆˆ ๋งŒํผ์˜ ์ตœ์‹  ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„์š”!

let disposeBag = DisposeBag()        
let subject = ReplaySubject<String>.create(bufferSize: 4) //observer

subject.onNext("Hi 1")
subject.onNext("Hi 2")
subject.onNext("Hi 3")
subject.onNext("Hi 4")

let o1 = subject.subscribe {print (">>1",$0)}
o1.disposed(by: disposeBag)

subject.onNext("a")
subject.onNext("b")

let o2 = subject.subscribe{print(">>2",$0)}
o2.disposed(by: disposeBag)

subject.onNext("c")
subject.onNext("d")
        

์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š”?

>>1 next(Hi 1)
>>1 next(Hi 2)
>>1 next(Hi 3)
>>2 next(Hi 3)
>>1 next(Hi 4)
>>2 next(Hi 4)
>>1 next(a)
>>2 next(a)
>>1 next(b)
>>2 next(b)
>>1 next(c)
>>2 next(c)
>>1 next(d)
>>2 next(d)

Async Subject

๋‹ค๋ฅธ subject์™€ ๋‹ฌ๋ฆฌ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์‹œ์ ์ด ๋‹ฌ๋ผ์š”!

completed ์ด๋ฒคํŠธ๊ฐ€ ์ „๋‹ฌ๋˜๊ธฐ ์ „๊นŒ์ง„ ์–ด๋– ํ•œ ์ด๋ฒคํŠธ๋„ ์ „๋‹ฌํ•˜์ง€ ์•Š์•„์š”.

๋ฐ˜๋ฉด ์œ„์—์„œ ์‚ดํŽด๋ณธ Subject๋“ค์€ ๋ฐ”๋กœ ์ „๋‹ฌ์ด ๋˜์—ˆ์ฃ !

completed๋˜๋ฉด ๊ทธ ์‹œ์ ์—์„œ ๊ฐ€์žฅ ์ตœ๊ทผ ์ด๋ฒคํŠธ ํ•˜๋‚˜๋งŒ next๋กœ ์ „๋‹ฌํ•ด์š”.

let asubject = AsyncSubject<Int>()
asubject.onNext(1)
asubject.onNext(2)
asubject.onNext(3)
asubject.onCompleted()
aSubject.subscribe({event in
                    print(event)

})
asubject.onNext(4)
asubject.onNext(5)
profile
๐Ÿ‘ฉโ€๐ŸŒพ GitHub: ezidayzi / ๐Ÿ“‚ Contact: ezidayzi@gmail.com

0๊ฐœ์˜ ๋Œ“๊ธ€