Swift API ์ง์นจ์ ์๋ฌธ์ ๊ท์ฝ์ ์ค์ ํฉ๋๋ค.
ํ์ฌ Swift ์ฝ๋๋ฒ ์ด์ค์๋ NotificationCenter.rac_notifications(forName:object:)
๋ฐ URLSession.rac_data(with:)
๋ ๊ฐ์ง ์์ธ๊ฐ ์์ต๋๋ค. ๋ํ IIRC์์ Rex๋ฅผ Cocoa Bindings repo์ ์ผ๋ถ๋ก ๋ณํฉํ ์์ ์ด๋ฏ๋ก rex_
์ ๋์ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ผ ํ ๊น์, ์๋๋ฉด ๊ทธ๋๋ก ๋๋ฌ์ผ ํ ๊น์?
์ด ๋ฆฌํฌ์งํ ๋ฆฌ์ ์๋ ๋ ๊ฐ์ ํ์ฅ์ ๋ํด ๊ฐ์ฅ ๋
์ฐฝ์ ์ด์ง ์์ ์ด๋ฆ์ ์๋ง๋ makeProducer
์
๋๋ค.
ํฉํ ๋ฆฌ ๋ฉ์๋์ ์ด๋ฆ์ "make"๋ก ์์ํฉ๋๋ค(egxmakeIterator()).
ํธ์ง: ๋ ๋ฒ์งธ ์๊ฐ ํ, ์์ฐ์์ ๊ฒฝ์ฐ ์์๋ ๋๊น์ง ๋ถ์์ฉ์ด ์ ์ฉ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ๋ฌํ ๋ด์ฉ์ ์ค๋ช
ํ๋ ๋ณ๊ฒฝ๋์ง ์๋ ์ด๋ฆ์ ์ ์ ํ IMO๊ฐ ๋ ๊ฒ์
๋๋ค(์: notifications(forName:object:)
.
์ ์ด๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ ํ์ด ์ด๋ฆ์ ๋ชจํธํ์ง ์๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์ ๋์ฌ๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค. ์๋๋ฉด ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ค์ ์งํฌ ์ ์์ต๋๋ค. ๋ ์ธํ๋ฆฌ์์์ด.
์ ์งํ๋ค๋ฉด ์ฌ๊ธฐ์ rac_
๋ฅผ ์ฌ์ฉํ๊ณ (Rex์ ์ฝ๋ ํฌํจ) ReactiveSwift์ ๋ํ ์ ์ ๋์ฌ๋ฅผ ์ฐพ์์ผ ํฉ๋๋ค.
๋ฐ์ธ๋ฉ์ ์ ๋์ฌ๋ฅผ ์ญ์ ํ๋ฉด ์ ์ฅ๋ ์์ฑ๊ณผ ์ด๋ฆ ์ถฉ๋์ด ๋ฐ์ํ๋ฏ๋ก ์ด์ ๋ํ ๋์์ ๋ชจ๋ ์์ฑ์ ํธ์คํ ํ๋ ํ๋ก์๋ฅผ ๋์ ํ๋ ๊ฒ์ ๋๋ค.
์
view.bindables.text <~ property
// `view.bindables` is of type `Bindings<UIView>`, which conforms to `BindingsProtocol`
// that requires an associated type `Owner`.
//
// `view.bindables.text` is provided by the extension to `BindingsProtocol` for all
//`Owner` inherited from `UIView`.
(๋๋ ๊ทธ๋ฅ rac
? ๊ทธ๋ฌ๋ ReactiveSwift์ ReactiveCocoa ๋ชจ๋ ์ผ์ข
์ ๋ฐ์ธ๋ฉ์ ๋
ธ์ถํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.)
... ์๋๋ฉด view.textProxy
, view.reactiveText
๋๋ ๋ฌด์์ด๋ ์ด๋ฆ์ ์ง์ ํ์ญ์์ค.
ํธ์ง: ๋น ๋ฅธ ํ๋กํ ํ์ ์ ๋ง๋ค์์ต๋๋ค(https://github.com/RACCommunity/Rex/pull/143).
ํธ์ง 2: ์๋ง์ง์ฐฝ์ ์ ์ ์ ๋ฆฌํ์ญ์์ค. :NS
ReactiveCocoa 5+๋ Rex์ ํธํ๋ ํ์๊ฐ ์์ต๋๋ค. RAC๋ ๋ ์ค๋ฅผ ์ธ์ํฉ๋๋ค.
๋ฌผ๋ก , ๋๋ ๋จ์ง Rex๊ฐ ๊ฐ์ ธ์จ ๋ฐ์ธ๋ฉ์ ์๋ฏธํ์ต๋๋ค. ์๋ง์ผ๋ก ์ฝํ๋ค๋ฉด ์ฃ์กํฉ๋๋ค. ๐ธ
outlets
๋ ๊ฒฝ์์๊ฐ ๋ ๊ฒ์
๋๋ค.
"reactive"๋ ์ ์ํ ์ธ์ด๋ก ๋ ๋์ ์ ํ๊ตฐ์ ๋๋ค. "rac_" ๋ฐ "rex_"๋ ๋งค์ฐ ์๋ชป๋ ์ด๋ฆ์ ๋๋ค. "๋ฐ์ํ", "ํ์ฑ" ๋๋ "์ ํธ"๋ก ์ด๋ํ์ฌ view.reactiveText ๋๋ view.activeText ๋๋ view.signalText๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
Swift์ ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ๋ ์ด์ ๋ฐํ์ ์ถฉ๋์ ์ํ์ด ์์ผ๋ฏ๋ก ์ ๋์ฌ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ฅ ๋ฒ๋ฆฌ์! :NS
๋ฐฉ๋ฒ์ผ๋ก๋ ๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ฑ์ ์ค๋ฒ๋ก๋ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ฑ์ ๋ํ ์ ๊ทผ ๋ฐฉ์์ ์ฐพ์์ผ ํฉ๋๋ค. ๐
bindable
ํ๋ก์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์์ต๋๋ค(์: view.bindables.something
). %view.something
์ ๊ฐ์ ๋จ์ถํค๋ฅผ ๋์
ํ ์ ์์ต๋๋ค. ๐
์ ์ด๋ Swift 3.0์์๋ ์ปดํ์ผ ํ์ ์ถฉ๋์ ํผํ๊ฑฐ๋ ๋ช ํํ๊ฒ ํ ์ ์๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ฆฌ๋ ๊ฒ์ด ์์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ์ฐ์๋ ๋ง๋ฒ ์์ฑ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ ์์ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ํ๋์ ๊ฐ์ฒด๋ก ์ ํํฉ๋๋ค.
๋ ์ข์ ์๊ธฐ ๋์ ์ด์์ ์ถฉ๋์ ์ํ์ด ์์ต๋๋ค ...
๋๋ ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ์์ฑ์ ๋ํ ์ ๋์ฌ์ ๋ถ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
SnapKit์ผ๋ก ์ํํ ์์ ์ค ํ๋๋ ํ์ฅ์ ํธ์คํ ํ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค. RAC API๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ฅํ ์ ์์ต๋๋ค.
struct UIButtonRACDSL {
var pressed: Signal<UIButton, NoError>
init(button: UIButton) { }
}
extension UIButton {
var rac: UIButtonRACDSL { return UIButtonRACDSL(button: self) }
}
์ด ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์ด๋ํ๋ฉด ์ฝ๊ฐ์ ์ ์ฐ์ฑ์ด ์ ๊ณต๋๊ณ ํ์ฅ์ ์ถฉ๋ ๋ฒ์๊ฐ ์ค์ด๋ญ๋๋ค.
์, ์ด์ ์ ํ๋กํ ์ฝ ๊ธฐ๋ฐ ๋ฒ์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ์ต๋๋ค. ๋ฐ์ค์ ์ ์ผ๋ก ๋ฐ๊พธ๊ณ ์ฐ์ฐ์ ์๊ธฐ๋ฅผ ๋์
ํ ์ ์์ต๋๋ค. rac
๋ฅผ ์์ฑ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ IMO๋ ์ด์จ๋ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ์ฝ์ด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๊ด์ฐฎ์ ๊ฒ์
๋๋ค.
rac
์์ฑ์ด ํจ์ฌ ๊นจ๋ํด ๋ณด์ผ ๊ฒ์
๋๋คโฆ :heart_eyes:
RxSwift๊ฐ ์ทจํ ์ ๊ทผ ๋ฐฉ์์ ํ์ณ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
https://github.com/ReactiveX/RxSwift/blob/4952adb27c684b47792923b00015516849061eab/RxCocoa/Common/Reactive.swift
https://github.com/ReactiveX/RxSwift/blob/4952adb27c684b47792923b00015516849061eab/RxCocoa/iOS/UIControl%2BRx.swift
๊ทธ๋ค์ ํ์ฅํ๋ ค๋ ์ ํ์ ๋ํด ์ผ๋ฐ์ ์ธ Reactive
๊ตฌ์กฐ์ฒด๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ํ๋ ํ์ฅ์ ๋ํ ๋ฉ์๋๋ฅผ Reactive
. ๋ถ๋ช
ํ ๊ทธ๋ค์ ์ด๊ฒ์ Swift์ .lazy
๋ชจ๋ธ๋ก ๋ง๋ค์์ต๋๋ค.
์๋ง๋ ํ์น๋ ๊ฒ์ด ์๋ ๊ฒ์ ๋๋ค.
https://github.com/RACCommunity/Rex/pull/143/commits/86f03c3b2d4759c87254a9ea3b28939f23f6be56
๐
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
SnapKit์ผ๋ก ์ํํ ์์ ์ค ํ๋๋ ํ์ฅ์ ํธ์คํ ํ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค. RAC API๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ฅํ ์ ์์ต๋๋ค.
์ด ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์ด๋ํ๋ฉด ์ฝ๊ฐ์ ์ ์ฐ์ฑ์ด ์ ๊ณต๋๊ณ ํ์ฅ์ ์ถฉ๋ ๋ฒ์๊ฐ ์ค์ด๋ญ๋๋ค.