๐.bind(with:onNext:)์ ๋ฉ๋ชจ๋ฆฌ ๋์?
๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์งํ๋ ค๊ณ ์ฐ๋ RxSwift์ .bind(with:onNext:) ๋ชจ๋ ์๊ณ ๊ณ์ ๊ฐ์?
๊ฐ์ฒด์ ๋ํ retain ์์ด ์ฐธ์กฐํ๊ธฐ ์ํด .bind(with:onNext:) ์ฐ๋๋ฐ ์ ๋ชฉ์ ๋ญ ๋ฉ๋ชจ๋ฆฌ ๋์ ์ผ์ด๋๊ธฐ ๋ฑ ์ข๋ค๊ณ ํ๋๊ฑฐ๋!! ๋ผ๊ณ ํ ์ ์๋๋ฐ์.
ํ๋ก์ ํธ๋ฅผ ํ๋ค๊ฐ ์ด๋ ๋ ๋ณด๋ ๋ทฐ์ปจํธ๋กค๋ฌ์ deinit์ด ์ฐํ์ง ์๋ ์ด์๊ฐ ์์์ต๋๋ค.
ํน์ ์ด ์ฝ๋์์ ์ด์ํ์ ์ด ๋ณด์ด์๋์???
onNext ํด๋ก์ ์ ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ผ๋ก owner ๊ฐ ์๋๋ฐ ํด๋ก์ ๋ด๋ถ์ self…๋ ์ฌ์ฉ๋๊ณ ์๋ค์?
๋ญ๊ฐ ์ด์ํ์ง ์๋์??
์ฐ์ .bind(with:onNext:)๊ฐ ๋ญ์ง ์ ํํ ์์๋ณด๊ธฐ ์ํด RxSwift์ .bind(with:onNext:) ๊ตฌํ๋ถ๋ก ๊ฐ๋ณด๋ฉด with ์ ์ธ์๋ก๋ ๋ฌด์์ ๋ฃ์ด์ผํ๋์ง ์ค๋ช ํ๊ณ ์๋๋ฐ,
"The object to provide an unretained reference on."
“์ฐธ์กฐ๊ฐ retain๋์ง ์๋๋ก ํ๊ณ ์ถ์ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ค๋ค”
๊ทธ๋ ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์์ฃผ ์์ฐ์ค๋ฝ๊ฒ with ํ๋ผ๋ฏธํฐ์ ์ธ์๋ก self๋ฅผ ๋ฃ์ด์ฃผ๊ณ ์์๋๋ฐ ๊ทธ๊ฒ ๊ฐ์ฒด์ rc๋ฅผ ์ฌ๋ฆฌ์ง ์๊ฒ ํด์ ๋ฉ๋ชจ๋ฆฌ ๋ฆญ์ ๋ฐฉ์งํ๊ณ ์ ํ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ with์ ์ธ์๋ก ๋ฃ์ self, ์ฆ, retainํ์ง ์์ ๊ฐ์ฒด๋!
onNext ํด๋ก์ ์์ ์ฐ๋ฆฌ๊ฐ ์ง์ ํด ์ค owner ๊ฐ์ ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํด ์ฃผ์ด์ผ ๋น๋ก์ retain๋์ง ์์ผ๋ฉฐ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ๋๋ค.
with ์ธ์๋ก self๋ฅผ ์ ๋ฌํด ์ฃผ์๋ค๊ณ ๋ง๋๋ก ์ฐ๋ฆฌ๊ฐ ํด๋ก์ self๋ฅผ ๋ง์๋๋ก ์จ์ฃผ๋ฉด ์ ๋๋ ๊ฒ์ด์ฃ ใ ใ
๊ต์ฅํ ์ฌ์ํ์ง๋ง, ์ฌ์ํ๋งํผ ๋์น๊ณ ๋์ด๊ฐ๊ธฐ ์ฌ์ด๊ฒ ๊ฐ๊ณ ํด๋ก์ ๋ด๋ถ์์ owner๋ก ์ฌ์ฉ๋๋๋ก ๊ฐ์ ๋ ๊ฒ๋, self๋ฅผ ์ผ๋ค๊ณ ์ปดํ์ผ ์๋ฌ๋ฅผ ๋์์ฃผ๋ ๊ฒ๋ ์๋๊ธฐ ๋๋ฌธ์ ์ถฉ๋ถํ ๋ง์ ์ฌ๋๋ค์ด ์ค์ํ ์ ์์๊ฒ ๊ฐ์ ๊ณต์ ํ๊ณ ์ถ์์ต๋๋ค.
๐ ์ค์ฒฉ ํด๋ก์ ์ ๋ฉ๋ชจ๋ฆฌ ๋์
๊ทธ๋ฆฌ๊ณ ๋ ํ ๊ฐ์ง!
.bind(with:onNext:)ํด๋ก์ ๋ด๋ถ์ ์ค์ฒฉ๋๋ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ ์ ์ํด์ผ ํ ์ ์ ๋ํด ๋งํด๋ณด๋ ค ํฉ๋๋ค.
๋ง์ฝ onNext ๋ก ์ ๋ฌ๋๋ ํด๋ก์ ๊ฐ ์ด๋ ๊ฒ ์ค์ฒฉ ํด๋ก์ ์ผ ๊ฒฝ์ฐ,
๋ด๋ถํด๋ก์ ์ [weak self]๋ฅผ ํด์ค์ผ๋ก์จ self์ ๋ํ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฌ๋ฆฌ์ง ์๋๋ก ์๋ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ด๋จ๊น??
์ธ๋ถ ํด๋ก์ ์์๋ .bind(with:onNext:)๋ก ๊ฐ์ฒด์ ๊ฐํ ์ฐธ์กฐ๋ฅผ “๋ฐฉ์ง”ํด์ฃผ์๊ณ , ๋ด๋ถํด๋ก์ ์์๋ [weak self]๋ฅผ ์จ์ฃผ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์ผ์ด๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ ์ ์์ง๋ง, ์ํ๊น๊ฒ๋(?) ๋ฉ๋ชจ๋ฆฌ๋ฆญ์ด ๋ฐ์ํ๋ ์ฝ๋์ ๋๋ค.
โญ๏ธ ์ค์ฒฉ๋ ํด๋ก์ ๋ ๋งค์ฐ ์ค์ํ๊ฒ ๊ณ ๋ คํด์ฃผ์ด์ผ ํ ๊ฒ ์๋๋ฐ์,
๋ฐ๋ก ์ธ๋ถ ํด๋ก์ ์์ ๊ฐ์ฒด๋ฅผ ์ด๋ป๊ฒ ์ก์์ฃผ๊ณ ์๋์ง๊ฐ ๋ด๋ถํด๋ก์ ์๋ ์ํฅ์ ๋ผ์น๋ค๋ ๊ฒ์ ๋๋ค.
์๊น ์์์ ๋ดค๋ ๊ทธ๋ฆผ์ ์ค๋ช ํด ๋ณด์๋ฉด,
๋ด๋ถํด๋ก์ ์์ [weak self]๋ฅผ ํด์ฃผ๋ ์๊ฐ, ์ธ๋ถ ํด๋ก์ ์์ self๋ฅผ ์ด๋ป๊ฒ ์ฐธ์กฐํ๊ณ ์๋์ง ์ดํผ๊ฒ ๋๋๋ฐ ์ด๋ ๊ฒ ๋๋ฉด ์๋ ๊ทธ๋ฆผ๊ณผ ๋์ผํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
์ฆ, ์ธ๋ถ ํด๋ก์ ์์ [weak self]๋ฅผ ์ฐ์ง ์๊ณ ๋ด๋ถ ํด๋ก์ ์์ [weak self]๋ฅผ ์ฐ๋ ์๊ฐ
์ธ๋ถ ํด๋ก์ ์์ ๊ฐํ๊ฒ self๋ฅผ ์บก์ฒํ๊ณ ์๋ ๊ฒ์ฒ๋ผ ๋๋๊น ๋ฉ๋ชจ๋ฆฌ ๋ฆญ์ด ์๊ธฐ๊ฒ ์ฃ ?
* ์ฐ๋ฆฌ๋ onNext ํด๋ก์ ์์ owner๋ผ๋ ์ด๋ฆ์ผ๋ก self์ ๋ํ ์ฐธ์กฐ ๊ณ์๋ฅผ ์ฌ๋ฆฌ์ง ์๊ณ ์ฌ์ฉํ๊ฒ ๋ค๊ณ ์์ฑํด ์ค ๊ฒ์ด์ง, self์์ฒด๋ ๊ฐํ๊ฒ ์ฐธ์กฐํ๊ณ ์๋ ๊ฒ์ด๋๊น์! (๊ทธ๋์ ์์ ์ฒซ ๋ฒ์งธ ์ฃผ์ ์์ ๋งํ๋ ๊ฒ์ฒ๋ผ ํด๋ก์ ๋ด์์ self๋ฅผ ์จ์ฃผ๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฆญ์ด ์ผ์ด๋๋ ๊ฒ์ด๊ณ ์.)
๊ทธ๋ผ ์๋ ์ฝ๋๋ ์ด๋จ๊น์?
์ธ๋ถํด๋ก์ ์์๋ ํด๋ก์ ๋ฅผ ์ฝํ๊ฒ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด ํด๋ก์ ์ ์ค์ฒฉ์ผ๋ก ์ฐ์ด๋ self๋ ๋ชจ๋ rc๋ฅผ ์ฌ๋ฆฌ์ง ์๊ณ ์ฐธ์กฐํ๊ฒ๋ฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋ฆญ์ด ์๊ธฐ์ง ์๋ ๊ฒ์ด์ฃ !
๊ทธ๋ ๋ค๋ฉด ์ด ์ฝ๋๋ ์ดํด๊ฐ ๋์๊ฒ ์ฃ ?
๋ด๋ถํด๋ก์ ์์ ๊ฐํ๊ฒ ์บก์ฒํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋๋ผ๋ ์ธ๋ถ ํด๋ก์ ์์ ์ด๋ฏธ ์ฝํ๊ฒ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ self๋ฅผ ์บก์ฒํ๋ ๋ ๊ณณ ๋ชจ๋ rc๋ ์ฌ๋ฆฌ์ง๋ ์์ต๋๋ค.
์ด๋ฒ ์ฃผ์ ์์๋ RxSwift์์ ๋ง์ด ์ฐ๊ณ ์๋ .bind(with:onNext:)์ ๋ํด์ ์์๋ดค์ต๋๋ค.
์ด๋ฒ ๊ธ์ ๋ ๋ฒ์งธ ์ฃผ์ ๋ก ์ค๋ช ํ๋ ์ค์ฒฉ ํด๋ก์ ์์๋ RX๋ฅผ ์ ์ฉํ์ง ์์ ๋ณดํต์ ์ค์ฒฉ ํด๋ก์ ์์๋ ๋์ผํ๊ฒ ๋ฌธ์ ๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ํด์ค์๋ค.
๊ฐ์ฒด๋ฅผ ๊ฐํ๊ฒ ์บก์ฒํจ์ผ๋ก์จ ๋ฐ์ํ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉํ์ง๋ง, ์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋์๊ฐ ์ถฉ๋ถํ ์ผ์ด๋ ์ ์๋ ๊ฒ์ด .bind(with:onNext:)์ด๊ธฐ ๋๋ฌธ์ ์ ์ํด์ ์ฌ์ฉํด์ฃผ์ด์ผํ ๊ฒ ๊ฐ์ต๋๋ค:)
'RxSwift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[RxSwift] Hot&Cold Observable (3) | 2024.08.29 |
---|---|
[RxSwift] Observable stream ์์ share๊ฐ ํ์ํ ์ด์ | multiCast, uniCast (0) | 2024.08.23 |