RxSwift

[RxSwift] ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ผ์–ด๋‚˜๊ธฐ ๋”ฑ ์ข‹์€(?) .bind(with:onNext:) & ์ค‘์ฒฉ ํด๋กœ์ €์˜ ๊ฐ์ฒด ์ฐธ์กฐ

ํ•˜์ดD:) 2024. 9. 9. 12:26

 

 

 

๐Ÿ“.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