๐ง๐ปโ๏ธ์์ฝ๐ง๐ปโ๏ธ
Rx๋ Observable<T> ํํ๋ก ํํ๋๋ ๋น๋๊ธฐ์ ๋ฐ์ดํฐ ํ๋ฆ์ ์ฌ์ฉํ ํ๋ก๊ทธ๋๋ฐ์ด๋ค. ๊ทธ๊ฒ์ด ๊ธฐ๋ฐ์ด ๋์ด Swift ์ ์ฉ์ผ๋ก ๊ตฌํ๋ ๊ฒ์ด ๋ฐ๋ก RxSwift์ด๋ค. Rx๋ ๋น๋๊ธฐ์ ์์ ๊ณผ ๋ฐ์ดํฐ ํ๋ฆ ๊ตฌ์ฑ์ ์ฝ๊ฒ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ด์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ๋์ด์๋ค. ์ ๋ฌ๋๋ ์ด๋ฒคํธ์ ๋ฐ๋ก ๋ฐ์ํ์ฌ ์์ ์ด ์ด๋ฃจ์ด์ง๋ค.
Reactive ๊ตฌ์ฑ ์์๋ก๋ Observable(๊ด์ฐฐ๋์), Operator(์ฐ์ฐ์), Observer(๊ด์ฐฐ์)๊ฐ ์์ผ๋ฉฐ, ๊ด์ฐฐ์๊ฐ ๊ด์ฐฐ๋์์ ๊ตฌ๋ (Subscribe)ํด์ผ๋ง ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ ์๋ค. ๋ฐ์ดํฐ ํ๋ฆ๋ค์ด ์ด๋ฒคํธ์ ๋ด๊ฒจ Observable์์ ์์ํด Operator์ ๊ฑฐ์ณ Observer์๊ฒ ๋๋ฌํ๋ค.
๋น๋๊ธฐ ์์
Rx์ ๋ํด ์๊ธฐ ์ ๋น๋๊ธฐ๊ฐ ๋ฌด์์ธ์ง ์๊ณ ๊ฐ์ผํ๋ค. ๋น๋๊ธฐ๋ ๊ฐ๋จํ๊ฒ ๋์์ ์ฌ๋ฌ ์ผ์ ์ํํ๋ ๊ฒ์ผ๋ก, ์๋ฅผ ๋ค์ด ์ธ์คํ๊ทธ๋จ ํ๋กํ์ ๋ก๋ํ ๋ ๋ฉ์ธ์์๋ UI๋ฅผ ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๊ณณ์์๋ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค. ์ด๋ ๊ฒ ์์ผ๋ก๋ ์ฌ์ฉ์ ๊ฒฝํ์ ํด์น์ง ์์ผ๋ฉด์ ๋ค์์ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
Reactive Programming์ด๋?
Reactive Programming์ ํ๊ตญ์ด๋ก ํ๋ฉด ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก, ๋น๋๊ธฐ์ ์ธ ๋ฐ์ดํฐ ํ๋ฆ์ ์ฌ์ฉํ ํ๋ก๊ทธ๋๋ฐ์ด๋ค. ๋ชจ๋ ๊ฒ์ ๋น๋๊ธฐ์ ์ธ ๋ฐ์ดํฐ ํ๋ฆ์ผ๋ก ๋ณด๋ฉฐ *Observer ๋์์ธ ํจํด์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ธ ์ด๋ฒคํธ๋ค์ ์ฒ๋ฆฌํ๋ค.
์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์ด๋ฒคํธ์ ๋ฐ๋ก ๋ฐ์ํ๋ค. ํ ์คํธ ํ๋์ ๊ฐ์ ์ ๋ ฅํ๋ฉด ์ด ํ ์คํธ ํ๋์ ์ฐ๊ฒฐ๋์ด ์๋ ์์ ์ผ๋ก ์ ๋ ฅ๊ฐ์ด ๋ฐ๋ก ์ ๋ฌ๋๋ค. ์ฆ Reactive Programming์ Data Binding์ ํตํด View์ Model์ด ๋ฐ๋ก๋ฐ๋ก ์๋ก ์ํฉ์ ๊ณต์ ํ๋ฉฐ ์ ๋ฐ์ดํธํ๋ค.
๊ฐ์ฒด์ ์ํ ๋ณํ๋ฅผ ๊ด์ฐฐํ๋ ์ต์ ธ๋ฒ๋ฅผ ๊ฐ์ฒด์ ๋ฑ๋กํ์ฌ ์ํ ๋ณํ ๋ฐ์ ์ ๊ฐ์ฒด๊ฐ ์ง์ ์ต์ ธ๋ฒ์ ์๋ฆฌ๋ ๋์์ธ ํจํด์ด๋ค.
RxSwift
ReactiveX๋ Observable<Element> ์ธํฐํ์ด์ค๋ก ํํ๋๋ ๊ณ์ฐ์ ์ผ๋ฐ์ ์ธ ์ถ์ํ๋ก, Observable ์คํธ๋ฆผ์ ๊ฐ๊ณผ ๊ธฐํ ์ด๋ฒคํธ๋ค์ ๋ฐฉ์กํ๊ณ (broadcaste)ํ๊ณ ๊ตฌ๋ (๊ด์ฐฐ)ํ ์ ์๋ค. RxSwift๋ ์ด๋ฌํ Rx์ Extension ํ์ค์ผ๋ก ๋ง๋ค์ด์ง Swift ์ ์ฉ ๊ตฌํ์ด๋ค.
RxSwift์ ์๋๋ Observable ๊ฐ์ฒด ํํ๋ก ๋น๋๊ธฐ ์์ ๊ณผ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๊ตฌ์ฑํ๋ ๊ฒ์ ์ฝ๊ฒ ํ๊ธฐ ์ํจ์ด๋ค. ๋ฐ๋ผ์ ์ด๋ฐ ๋น๋๊ธฐ ์์ ๋ค์ ๋ณํํ๊ณ ๊ตฌ์ฑํ๋ ์ฌ๋ฌ ๋ฉ์๋๋ค์ ์ ๊ณตํ๋ค.
Apple์์๋ ํจ์, Closure, Notification ๋ฑ ๋ค์ํ ๋ฐฉ์์ผ๋ก ํธ์ถ์ ์๋ตํ ์ ์๋ค. ํ์ง๋ง ์ด๋ ์ฝ๋๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋ ๋ค. RxSwift๋ KVO ๊ด์ฐฐ, ๋น๋๊ธฐ ๊ด์ฐฐ, UI ์ด๋ฒคํธ, ๊ธฐํ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ํ์ค(Observable)์ ์ถ์ํ๋ก ํตํฉํ๋ค. ์ฆ, ํ๊ฐ์ง๋ง์ผ๋ก๋ ํธ์ถ์ ์๋ตํ ์ ์๊ฒ ๋ง๋ค์ด์ก๋ค
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
Rx๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด๊ธฐ๋ ํ๋ค ๋๋ค. ๋ฐ๋ผ์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ๋ฌด์์ธ์ง ์ ์ดํดํ๋ ๊ฒ์ด ์ข๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ฝ๋ฉ ์ค ์ค๋ฅ์ ์์ง๊ฐ ์๋ ๋ณ์ ์ฌ์ฉ์ ์ง์ํ๊ณ ์์ ํจ์๋ค์ ์ฌ์ฉํด์ ํ๋ก๊ทธ๋๋ฐํ๋ ๋ฐฉ์์ด๋ค. ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ผ๋ฐ์ ์ผ๋ก ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ๋์ด ์๋ค. ์๋ฅผ ๋ค์ด ์๋ ์ฝ๋๋ '์ซ์๋ค ์ค ์ง์๋ง ๊ณจ๋ผ ๋ค์ ๋๋ํ๋ฅผ ๋ถ์ธ ๊ฒ์ด๋ค'๋ฅผ ์๋ฏธํ๋ค. ์ด์ฒ๋ผ ์ ์ธํ๋ ํํ๋ฅผ ๋๋ ๊ฒ์ด ๋ฐ๋ก ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์ด๋ค. ๋ณดํต ์ง์ ๊ตฌํํ๊ธฐ ๋ณด๋ค๋ .filter, .map ๋ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฏธ ๊ตฌํ๋์ด ์๋ ํจ์๋ฅผ ๊ฐ์ ธ๋ค ์ฌ์ฉํ๋ค.
//'์ซ์๋ค ์ค ์ง์๋ง ๊ณจ๋ผ ๋ค์ ๋๋ํ๋ฅผ ๋ถ์ธ ๊ฒ์ด๋ค'
Observable<Int>.of(1, 2, 3)
.filter { $0%2 == 0 }
.map { number in
number.description + "!"
}
// 2!
โญ๏ธ Reactive ๊ตฌ์ฑ
Reactive๋ ์ธ ๊ฐ์ง ๊ตฌ์ฑ์์๊ฐ ์๋ค. Observable, Operator, Observer
Observable์ ์ฌ์ ์ ์ ์๋ '๊ด์ฐฐ๋ ์ ์๋'์ด๋ค. ์ฆ, ๊ด์ฐฐ ๋์์ด๋ค. ์ต์ ธ๋ฒ๋ธ ์์๋ ์ฐ์์ ์ผ๋ก ๋ฐํ๋์ด ๋์ค๋ ๊ฐ๋ค์ด ์๋๋ฐ, ์ด๊ฒ๋ค์ ๋ฐ๋ก ๋ฐ์ดํฐ ํ๋ฆ์ด๋ค. ์ด ํ๋ฆ๋ค์ ์์ํจ์์ธ Operator์ ๊ฑฐ์ณ ์ฐ์ฐ๋๋ค. ์ฐ์ฐ๋ ๋ฐ์ดํฐ๋ค์ ์ด๋ฒคํธ์ ๋ด๊ฒจ ์ ๋ฌ๋๋ค. ์ด๋ฌํ ๊ณผ์ ์ ๊ณ์ ์ง์ผ๋ณด๋ ๊ฒ์ด ๋ฐ๋ก ๊ด์ฐฐ์ Observer์ด๋ค. ์ต์ ธ๋ฒ๋ ์ง์ผ๋ณด๊ธฐ ์ ์ต์ ธ๋ฒ๋ธ์ ๊ตฌ๋ (subscribe)ํด์ผํ๋ค. ๊ทธ๋ ๊ฒ ๋ฐ์ ์ด๋ฒคํธ ์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด ์ต์ ธ๋ฒ ๋ง์๋๋ก ์์ ํ ์ ์๋ค. ์ด ์์ ์ด ๋ฐ๋ก subscribe ๋ธ๋ก ์์ ์ ํ ์๋ค.
Observable<Int>.of(1, 2, 3)
.filter { $0%2 == 0 }
.map { number in
number.description + "!"
}
.subscribe{ value in
print(value)
}
//์ถ๋ ฅ
>> next(2!)
>> completed
+ Observable = Sequence
์ํ์ค๋ ์์๋ค์ ์ํํ ์ ์๋ ํ์ ์ผ๋ก, ์ต์ ธ๋ฒ๋ธ์ ์ผ๋ จ์ ๋ฐ์ดํฐ ํ๋ฆ์ด ์๊ธฐ ๋๋ฌธ์ ์ํ์ค๋ผ ๋ถ๋ฆฐ๋ค.
์ด๋ฒคํธ ์ ํ 3๊ฐ์ง
์ด๋ฒคํธ ์ ํ | |
Next(Element) | ์ํ์ค์ ๋ฐ์ดํฐ ์์๋ฅผ ์ ๋ฌํ๋ค. |
Error(Swift.Error) | ์ต์ ธ๋ฒ๋ธ์ด ์๋ฌ๋ฅผ ๋ฐ์์์ผ ์ถ๊ฐ์ ์ธ ์ด๋ฒคํธ๋ฅผ ์์ฑํ์ง ์๋๋ค. |
Completed | ์ผ๋ จ์ ์ด๋ฒคํธ๋ค์ ๋ชจ๋ ์ฑ๊ณต์ ์ผ๋ก ๋ฐฉ์ถํ๋ค. ์ฆ, ์ต์ ธ๋ฒ๋ธ์ด ์ฑ๊ณต์ ์ผ๋ก ์์ ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ง๋ฌด๋ฆฌํด์ ๋์ด์ ์ด๋ฒคํธ๋ฅผ ์์ฑํ์ง ์๋๋ค. |
Observable์ ์๋ช ์ฃผ๊ธฐ
๋คํธ์ํฌ ํ์ผ ๋ค์ด๋ก๋์ ๊ฐ์ด ์ ํํ ์ํ์ค์ ๊ฒฝ์ฐ๋ ์๊ณ , ๊ฐ๋ก๋ชจ๋-์ธ๋ก๋ชจ๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ ธ์ผ ํ๋ UI์ ๊ฐ์ด ๋ฌดํํ ์ํ์ค๋ ์๋ค. ๊ฐ๋ก ๋ชจ๋๋ก ๋ณ๊ฒฝ๋์๋ค๊ณ ํด๋ ๋ ๋ค์ ์ธ๋ก ๋ชจ๋๋ก ๋ณ๊ฒฝ์ด ์ผ์ด๋ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋๋ ๊ฒ์ด ์๋๋ผ ๊ทธ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ UI์ ์ต์ ธ๋ฒ๋ธ์ ์ ๋ ๋๋์ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ Error ๋๋ Completed ์ด๋ฒคํธ๋ ๋ฐ์ํ์ง ์๋๋ค.
Scheduler
์ค์ผ์ค๋ฌ๋ Rx์์์ DispatchQueue๋ก, ๋ ๊ฐ๋ ฅํ๊ณ ์ฌ์ฉ์ด ์ฝ๋ค. RxSwift์๋ ๋ง์ ์ค์ผ์ค๋ฌ๊ฐ ์ ์๋์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ๋ฐ๋ก ์์ฑํ ์ผ์ ๊ฑฐ์ ์๋ค.
Reactive Programming
RxSwift Github
โญ๏ธ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ๋ญ๊ฐ์?
ํจ์คํธ์บ ํผ์ค ๊ฐ์ - 30๊ฐ ํ๋ก์ ํธ๋ก ๋ฐฐ์ฐ๋ iOS ์ฑ ๊ฐ๋ฐ
'iOS > Rx' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ Rx ] ๊ฒฐํฉ ์ฐ์ฐ - 1. withLatestFrom (1) | 2023.10.06 |
---|