๐ŸŽ ์•„์ด-์˜ค-์—์Šค/โšก๏ธ RxSwift

[RxSwift] Disposables.create() ์™œ ํ•˜์ง€?

๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด 2022. 1. 16. 17:12

Disposables.create ๋ถ„์„ํ•ด๋ณด๊ธฐ

Rx๋ฅผ ํ•˜๋ฉด์„œ ๋งŽ์ด ๋“ค์—ˆ๋˜ ์˜๋ฌธ.. 

 let numbers = Observable<Int>.create { observer in
 	observer.onNext(1)
 	observer.onNext(2)
 	observer.onNext(2)
 	return Disposables.create()
 }

์—ฌ๊ธฐ์„œ ๋งˆ์ง€๋ง‰์— Disposables.create()๋ฅผ ์™œ ํ•˜์ง€??

 

๊ทธ๋ƒฅ ๋‹จ์ˆœํžˆ "๋ฐ˜ํ™˜ํƒ€์ž…์ด Disposable ์ด๋‹ˆ๊นŒ"๋Š” ๋ง์ด ์•ˆ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ์ด๋ฒˆ์—๋„ ์˜์‹์˜ ํ๋ฆ„๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ๋œฏ์–ด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

Disposables

๋จผ์ € Disposables.create๋‹ˆ๊นŒ ํƒ€์ž… ๋ฉ”์„œ๋“œ์ธ ๊ฒƒ ๊ฐ™์•„์„œ Disposables๋ฅผ ์ฐพ์•„๋ณด๊ธฐ๋กœ ํ–ˆ์–ด์š”.

Rx ์ €์žฅ์†Œ์— ๋“ค์–ด๊ฐ€๋ณด๋ฉด Disposables๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์žˆ๋„ค์š”. ์ €๊ธฐ๋กœ ๊ฐ€๋ณด์ฃ !

๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ Disposable์˜ ๊ตฌ์ฒดํƒ€์ž…์œผ๋กœ ์ถ”์ •๋˜๋Š” ํŒŒ์ผ๋“ค์ด ๋“ฑ์žฅํ•˜๋Š”๋ฐ์š”, ๊ฐ€์žฅ ๋งŒ๋งŒํ•ด๋ณด์ด๋Š” Disposables.swift๋ฅผ ์—ด์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ใ…Žใ…Ž ใ……ใ„ฑ~

๊ทธ๋ƒฅ ๊ตฌ์กฐ์ฒด์˜€๋„ค์š”.. ํ•œ ๊ฐ€์ง€ ์ถ”์ •ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š”๊ฑด ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋‹ˆ๊นŒ ์ผ๋‹จ ์„œ๋ธŒํด๋ž˜์‹ฑ์œผ๋กœ ๊ตฌ์ฒดํƒ€์ž…๋“ค์ด ๋งŒ๋“ค์–ด์ง€์ง€๋Š” ์•Š์„ ๊ฒƒ ๊ฐ™๊ณ , ํ”„๋กœํ† ์ฝœ๋„ ์•„๋‹ˆ๋‹ˆ๊นŒ ์–˜๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ์‚ผ์•„์„œ ๋ญ”๊ฐ€๋ฅผ ํ•˜์ง€๋„ ์•Š๊ฒ ์ฃ ?

 

๊ทธ๋ž˜์„œ ๋“  ์ƒ๊ฐ. '์•„! Disposable ํŒŒ์ผ๋งˆ๋‹ค Disposables์˜ Extension์ด ์žˆ๊ฒ ๊ตฌ๋‚˜..!' 

 

๊ทธ๋ฆฌ๊ณ  Extension์•ˆ์— create๋ฅผ ์›ํ•˜๋Š”๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ถ”์ •ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”. 

 

์ง€๊ธˆ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ ์‹ถ์€ create๋Š” 

 let numbers = Observable<Int>.create { observer in
 	observer.onNext(1)
 	observer.onNext(2)
 	observer.onNext(2)
 	return Disposables.create()
 }

 

์š”๋…€์„์ด๋‹ˆ๊นŒ ์ธ์ž๋ฅผ ๋ฐ›์ง€ ์•Š๋Š” create๊ฐ€ ๊ตฌํ˜„๋œ extension์„ ์ฐพ์•„๋ณด๋ฉด ๋˜๊ฒ ์ฃ ?

 

Disposables.create() ์ฐพ์•„๋ณด๊ธฐ

ํŒŒ์ผ ๋ช‡ ๊ฐœ๋ฅผ ๋“ค์–ด๊ฐ€๋ณด๋‹ˆ ์ œ ์ถ”์ธก์ด ๋งž์•˜์–ด์š”!

์•„๊นŒ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋ดค๋˜ ์—ฌ๋Ÿฌ Disposables ์˜ ๊ตฌ์ฒด ํƒ€์ž…๋“ค์ด ๋‚ด๋ถ€์— create ํƒ€์ž…๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ ์ด ์นœ๊ตฌ๋Š” create์—์„œ ์ธ์ž๋ฅผ ๋ฐ›๊ณ  ์žˆ์œผ๋‹ˆ๊นŒ ์ธ์ž๊ฐ€ ์—†๋Š” ํŒŒ์ผ์„ ์ฐพ์•„๋ณผ๊ฒŒ์š”.

๋ชฉ๋ก์— ์žˆ๋˜ Disposable ์ค‘์— NopDisposable.swift ๋ผ๋Š” ํŒŒ์ผ์ด ์žˆ์—ˆ๋Š”๋ฐ์š”, ๋‚ด๋ถ€์—์„œ ์ธ์ž๋ฅผ ๋ฐ›์ง€ ์•Š๋Š” create ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 

 

ํ•จ์ˆ˜ ๋ฐ”๋””๋ฅผ ๋ณด๋ฉด NopDisposable์˜ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ์ธ noOp๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ๋Š”๋ฐ์š”, ์ด ํ”„๋กœํผํ‹ฐ๋Š” ๊ทธ๋ƒฅ NopDisposable์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์ด ์ธ์Šคํ„ด์Šค์˜ dispose ๋ฉ”์„œ๋“œ๋Š” ๋น„์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋‚˜์ค‘์— dispose๊ฐ€ ํ˜ธ์ถœ๋˜์–ด๋„ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์ฃ . 

 

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ Observable์˜ create๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ดํ›„ ํด๋กœ์ €์— ์ •์˜๋œ subscribeHanlder๋ฅผ ๊ฐ€์ง„ AnonymousObservable์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋Š”๋ฐ์š”, subscribe๋ฅผ ํ†ตํ•ด ์ด ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ๋…ํ•˜๋ฉด ์‹œํ€€์Šค๋ฅผ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋Š” Disposable์ด ๋ฐ˜ํ™˜๋˜์—ˆ์ฃ .

 

ํ•˜์ง€๋งŒ ์œ„์—์„œ ์ •์˜ํ•œ ์˜ต์ €๋ฒ„๋ธ”์˜ ๊ฒฝ์šฐ์—๋Š” ๋น„๋™๊ธฐ์ž‘์—…์ด ์—†์œผ๋‹ˆ ๋”ฐ๋กœ ์ทจ์†Œํ•˜์ง€ ์•Š์•„๋„ ์‹œํ€€์Šค๊ฐ€ ์ทจ์†Œ๋˜๋ฉด ๋ชจ๋“  ์ž‘์—…์ด ์ข…๋ฃŒ๋˜๋‹ˆ๊นŒ ๋”ฐ๋กœ ๋™์ž‘์ด ํ•„์š”์—†๋Š” ๋นˆ disposable์„ ๋ฐ˜ํ™˜ํ•ด์ฃผ์–ด๋„ ๋˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

๋น„๋™๊ธฐ ์ž‘์—…์ด ์กด์žฌํ•˜๋Š” Observable์˜ create

๋งŒ์•ฝ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์กด์žฌํ•œ๋‹ค๋ฉด ์ด์•ผ๊ธฐ๊ฐ€ ์กฐ๊ธˆ ๋‹ค๋ฅด์ฃ . ์‹œํ€€์Šค๊ฐ€ ์ค‘๋‹จ๋˜์–ด๋„ escaping์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋น„๋™๊ธฐ ์ž‘์—…์€ ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. 

์ด ์ฝ”๋“œ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ–ˆ๋˜ ์ฝ”๋“œ์ธ๋ฐ์š”, ์ง€๊ธˆ๋ณด๋‹ˆ ๊ทธ๋ƒฅ single์„ ์“ฐ๋ฉด ๋˜๋Š”๋ฐ ์™œ Result๋ฅผ Observable๋กœ ๋ž˜ํ•‘ํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋„ค์š”.. 

 

์—ฌํŠผ ์ด ์ฝ”๋“œ์—์„œ๋Š” create์˜ ์ธ์ž๋กœ ํด๋กœ์ €๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์–ด์š”. dispose๋˜๋ฉด ์ง„ํ–‰์ค‘์ด๋˜ URLSession ํƒœ์Šคํฌ๋ฅผ ์ค‘๋‹จํ•˜๋ ค๋Š” ์˜๋„์˜€์ฃ . 

 

๊ทธ๋Ÿผ ํด๋กœ์ €๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” Disposables.create๋ฅผ ์ฐพ์•„๋ด…์‹œ๋‹ค!

 

์‚ฌ์‹ค ์•„๊นŒ ์šฐ์—ฐํžˆ ์Šคํฌ๋ฆฐ์ƒท์œผ๋กœ ์ฒจ๋ถ€ํ–ˆ๋˜ create๊ฐ€ ์ •๋‹ต์ด์—ˆ๋„ค์š”ใ…Žใ…Ž

 

์ด๋ฒˆ์—๋Š” AnonymousDisposable.swift๋ฅผ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

create ๋ฉ”์„œ๋“œ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์ „์— ๋‚ด๋ถ€ ๊ตฌ์„ฑ์„ ๋ณด๋ฉด, ์•„๊นŒ๋ณด๋‹ค๋Š” ์กฐ๊ธˆ ๋ณต์žกํ•ด์กŒ์–ด์š”. 

ํ•˜์ง€๋งŒ ๋ˆˆ์— ๋„๋Š” DisposeAction์ด ์žˆ๋„ค์š”. ์ƒ์„ฑ์ž์—์„œ escaping ํด๋กœ์ €๋ฅผ ๋ฐ›์•„์„œ disposeAction ํ”„๋กœํผํ‹ฐ์— ๋„ฃ์–ด์ฃผ๊ณ  ์žˆ๋„ค์š”. 

 

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ dispose ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด disposeAction์„ ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉํ•ด์„œ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ง์€ ๊ณง dispose๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ƒ์„ฑ์ž๋กœ ์ „๋‹ฌ๋œ ํด๋กœ์ €๊ฐ€ ๊ทธ๋Œ€๋กœ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ ์ฃผ์ธ๊ณต์ธ create ๋ฉ”์„œ๋“œ๋ฅผ ๋ณผ๊นŒ์š”? create์™€ ํ•จ๊ป˜ ์ „๋‹ฌ๋œ ํด๋กœ์ €๋ฅผ ์ธ์ž๋กœ AnonymousDisposable ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  Cancelable ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ฐ‘์ž๊ธฐ Cancelable์ด ๋‚˜์™”๋‹ค๊ณ  ๋‹นํ™ฉํ•˜์ง€ ๋งˆ์„ธ์š”!

Cancelable์€ Disposable์„ ์ฑ„ํƒํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด์—์š”. Disposable์—์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ํ˜„์žฌ Disposable์ด dispose ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด์š”. ์–ด์ฐจํ”ผ ์ƒ์œ„ ํ”„๋กœํ† ์ฝœ์ด Disposable์ด๋‹ˆ๊นŒ DisposeBag์— ๋‹ด๋Š”๋ฐ๋Š” ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์—†๊ฒ ์ฃ !

 

์ž ๊ทธ๋Ÿผ ์ข…ํ•ฉํ•ด๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ํด๋กœ์ €๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” dispose๊ฐ€ ๋ถˆ๋ฆด ๋•Œ ์‹คํ–‰ํ•  ํด๋กœ์ €๋กœ ๋“ฑ๋ก์„ ํ•ด๋‘๊ณ , dispose๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ•ด๋‹น ํด๋กœ์ €๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๋Š” ๊ฒƒ์ด์—ˆ๋„ค์š”. 

 

๋งˆ๋ฌด๋ฆฌ

Observable ์ฝ”๋“œ๋ฅผ ์ฝ์„ ๋•Œ๋Š” ์ •๋ง ํ˜ผ๋ˆ ๊ทธ ์ž์ฒด์˜€๋Š”๋ฐ, Disposable์€ ๊ฝค๋‚˜ ๊น”๋”ํ–ˆ์Šต๋‹ˆ๋‹ค! ์ญ‰ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๋ฉด,

 

1) Disposables์€ ๋‚ด๋ถ€์— ๊ตฌํ˜„์ด ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ๊ตฌ์กฐ์ฒด์ด๋‹ค.

2) Disposable์˜ ๊ตฌ์ฒดํƒ€์ž…๋“ค์€ ํŒŒ์ผ ๋‚ด๋ถ€์— Disposables ์˜ Extension์„ ๊ฐ๊ฐ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. 

3) Disposables.create์—์„œ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์œผ๋ฉด NopDisposable ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. ์ด ์ธ์Šคํ„ด์Šค์˜ dispose๋Š” ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

4) Disposables.create์— ํด๋กœ์ €๋ฅผ ํ•˜๋‚˜ ์ „๋‹ฌํ•˜๋ฉด AnonymousDisposable ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. ์ด ์ธ์Šคํ„ด์Šค์˜ dispose๋Š” ์ƒ์„ฑ๋  ๋•Œ ๋“ฑ๋กํ•ด๋‘” ํด๋กœ์ €๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.