observable์ ์์ฑํ๊ณ ๊ตฌ๋ ํ ๋ ๊ฐ๋ subscribe ๋์ asDriver(), drive()๋ก ๋ฐ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค .. ๋ญ์ง ?? ํ๋ฉด์ ์๊ณ ์ด๋ ์ค traits ๊ด๋ จ ๋ฌธ์๋ฅผ ์ฝ๊ณ
driver๊ฐ ์์ด ์ ๋ฆฌ ํด๋ณด๋ ค๊ตฌ ํฉ๋๋ค !
์ฐธ๊ณ ๋ฌธ์ : https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Traits.md#driver
Driver
UI layer์์ ์ข ๋ ์ง๊ด์ ์ผ๋ก ์ฌ์ฉํ๋๋ก ์ ๊ณตํ๋ trait
trait์ด๋ ?
"๋ชจ๋ ๊ฒฝ๊ณ์์ ์ฌ์ฉํ ์ ์๋ ์์ Observable๊ณผ ๋น๊ตํ ๋ ์ธํฐํ์ด์ค ๊ฒฝ๊ณ์์ observable ํ๋กํผํฐ๋ฅผ ์ ๋ฌํ๊ณ ๋ณด์ฅํ๋ฉฐ, ๋ฌธ๋ฒ์ ์ผ๋ก๋ ๋ ์ฝ๊ณ ๊ตฌ์ฒด์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํ์ผํ ํ๋๋ฐ ๋์์ด๋ฉ๋๋ค"
๋ผ๊ณ ์ ์๋์ด ์๋๋ฐ ์ ๊ฐ ์ฌํด์ํ trait์ observable ์ค ๋ช ํํ ์ด๋ฒคํธ ๊ท์น์ ๊ฐ์ง๊ณ ์๋ ์น๊ตฌ๋ค์ธ๊ฑฐ ๊ฐ์์. ๋ช ํํ ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ์ ํ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ต๋๋ค
๋ค์ Driver๋ก ๋์์์ ..
Driver์ ํน์ง
- ์ค๋ฅ๋ฅผ ๋ฐฉ์ถํ์ง ์๋๋ค
- observe๋ Main scheulder์์ ๋ฐ์ํ๋ค.
- ๋ถ์์ฉ์ ๊ณต์ ํ๋ค (?) ex> share(replay: 1, scope: .whileConnected)
๋ถ์์ฉ์ ๊ณต์ ํ๋ค๋ ๋ง์ด ๋ฌด์จ ๋ง์ธ๊ฐ ํด์ ๋ณด๋ ์๋ ์์๊ฐ ๋์ ์๋ค์
let results = query.rx.text
.throttle(.milliseconds(300), scheduler: MainScheduler.instance)
.flatMapLatest { query in
fetchAutoCompleteItems(query)
}
results
.map { "\($0.count)" }
.bind(to: resultCount.rx.text)
.disposed(by: disposeBag)
results
.bind(to: resultsTableView.rx.items(cellIdentifier: "Cell")) { (_, result, cell) in
cell.textLabel?.text = "\(result)"
}
.disposed(by: disposeBag)
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด
1. query์ ๋ํด fetchAutoCompleteItems (์๋ฒ์์ query)๊ฒฐ๊ณผ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ ์ํ
2. ๊ฐ์ ธ์จ resultfmf resultCount, tableview UI์ ๋ฐ์ธ๋ฉํ๊ณ ์์ต๋๋ค.
ํ์ง๋ง ์์์ ๋ง์ฝ fetchAutoCompleteItems ์ํ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋กํ ๊น์ ? ๋ฐํ๊ฐ์ด ์์์๋ ์๊ณ ํ์ฑ์ด ์๋ชป๋ ์๋ ์์๊ฑฐ ๊ฐ๋ค์. ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ฉด ๋ฐ์ธ๋ฉ์ด ํด์ ๋๊ณ UI๊ฐ ๋์ด์ ์๋ก์ด ์ฟผ๋ฆฌ์ ๋ํด ์ ๋ฐ์ดํธ ๋์ง ์์ ๊ฒ์ ๋๋ค.
๋ํ fetchAutoCompleteItems ์์ ์ค ์ผ๋ถ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ์คํ ๋ ์๋ ์์ต๋๋ค. ๋ชจ๋ UI๋ ๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋์ด์ผ ํ๋๋ฐ ๋ง์ด์ฃ .
๋์ฑ์ด result๋ ๋๊ฐ์ง ์์(resultCount, tableview)์ ๋ฐ์ธ๋ฉ ๋์ด ์์ต๋๋ค. ์ฆ ๊ฐ ์ฌ์ฉ์ ์ฟผ๋ฆฌ์ ๋ํด ๋๊ฐ์ HTTP ์์ฒญ์ด ๋ง๋ค์ด์ง๊ณ , ๊ฐ UI์์์ ํ๋์ฉ ์๋๋ ๋์์ด ์๋๋๋ค
๋ฐ๋ผ์ ์๋์ ๊ฐ์ด ์์ ๋์ด์ผ ํ ๊ฒ์ ๋๋ค.
let results = query.rx.text
.throttle(.milliseconds(300), scheduler: MainScheduler.instance)
.flatMapLatest { query in
fetchAutoCompleteItems(query)
.observeOn(MainScheduler.instance) // results are returned on MainScheduler
.catchErrorJustReturn([]) // in the worst case, errors are handled
}
.share(replay: 1) // HTTP requests are shared and results replayed
// to all UI elements
results
.map { "\($0.count)" }
.bind(to: resultCount.rx.text)
.disposed(by: disposeBag)
results
.bind(to: resultsTableView.rx.items(cellIdentifier: "Cell")) { (_, result, cell) in
cell.textLabel?.text = "\(result)"
}
.disposed(by: disposeBag)
๋๋ ์๋์ ๊ฐ์ด ์์ฑ๋ ์ ์์ต๋๋ค.
let results = query.rx.text.asDriver() // This converts a normal sequence into a `Driver` sequence.
.throttle(.milliseconds(300), scheduler: MainScheduler.instance)
.flatMapLatest { query in
fetchAutoCompleteItems(query)
.asDriver(onErrorJustReturn: []) // Builder just needs info about what to return in case of error.
}
results
.map { "\($0.count)" }
.drive(resultCount.rx.text) // If there is a `drive` method available instead of `bind(to:)`,
.disposed(by: disposeBag) // that means that the compiler has proven that all properties
// are satisfied.
results
.drive(resultsTableView.rx.items(cellIdentifier: "Cell")) { (_, result, cell) in
cell.textLabel?.text = "\(result)"
}
.disposed(by: disposeBag)
๋ฐ๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด
let results = query.rx.text.asDriver()
asDriver : ControlProperty trait์ Driver trait์ผ๋ก ๋ฐ๊พธ์์ต๋๋ค.
๋๋ฒ์งธ ๋ณํ๋
.asDriver(onErrorJustReturn: [])โ
observable ์ํ์ค๋ฅผ Driver trait์ผ๋ก ๋ฐ๊พธ์์ต๋๋ค.
๋ฐ๋ผ์ Driver์ ํน์ฑ์ ๋ง์กฑํ๊ฒ ๋ฉ๋๋ค (1. ์ค๋ฅ ๋ฐฉ์ถ x, 2. ๋ฉ์ธ ์ค๋ ๋์์ ์คํ, 3. ๋ถ์์ฉ์ ๊ณต์ ex) share )
asDriver()๋ ์๋์ ๊ฐ์ ํจ๊ณผ๋ฅผ ๊ฐ์ง๋๋ค.
let safeSequence = xs
.observeOn(MainScheduler.instance) // observe events on main scheduler
.catchErrorJustReturn(onErrorJustReturn) // can't error out
.share(replay: 1, scope: .whileConnected) // side effects sharing
return Driver(raw: safeSequence) // wrap it up
๋ง์ง๋ง์ผ๋ก
.drive(resultCount.rx.text)
resultCount๋ฅผ bind ํ๋ ๋์ drive ํด์ฃผ์์ต๋๋ค.
bind(to: )์ ๊ฐ์ ํจ๊ณผ๋ฅผ ๊ฐ์ง์ง๋ง Driver trait์ ํน์ฑ์ ๋ง์กฑํ๊ฒ๋ ๋ณด์ฅํฉ๋๋ค.
Driver์ ๋ํด ์ดํด๋ณด์์ต๋๋ค. bind์ ๊ฐ์ ์ญํ ์ ํ์ง๋ง Driver trait์ ๋ณด์ฅํ๋ค๋ ์ ์์ UI ๋ฐ์ธ๋ฉ์ ํ ๋ ๋งค์ฐ ์ ์ฉํ ๊ฒ ๊ฐ๊ตฐ์ trait์ ์ ์ฉํจ์ ์ ์ ๋ ์์๊ฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค์ ๊ธ์์๋
๋จ์ ControlProperty, ControlEvent, Signal trait์ ๋ํด ๊ณต๋ถ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค ๊ทธ๋ผ ์๋ฝ
'IOS๐ > RxSwift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[RxSwift] Schedular๋ (subscribeOn, observeOn) (0) | 2022.04.29 |
---|---|
[RxSwift] Signal, ControlProperty, ControlEvent ๋ ? (0) | 2022.03.21 |
[RxSwift] Traits ์ด๋ (0) | 2022.03.19 |
[RxSwift] Disposable DisposeBag ์ด๋ (0) | 2022.03.17 |
[RxSwift] Combine Operator(CombineLatest, Merge, StartWith, Concat, Zip, WithLastFrom, Sample, SwitchLatest, Debounce) (0) | 2022.03.06 |
๋๊ธ