|
| 1 | +# 250623 RxCocoa, Driver, asDriver, memory leak |
| 2 | + |
| 3 | +RxCocoa Driver์ ๋ด๋ถ sharing ๋ฉ์ปค๋์ฆ์ผ๋ก ์ธํ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฌธ์ ํด๊ฒฐ |
| 4 | + |
| 5 | +6์ 23์ผ (์) |
| 6 | + |
| 7 | +# ํ์ต๋ด์ฉ |
| 8 | + |
| 9 | +- **RxCocoa Driver์ ๋ด๋ถ ๋์ ์๋ฆฌ** |
| 10 | + - Driver๋ ๋ด๋ถ์ ์ผ๋ก `.share(replay: 1, scope: .whileConnected)` ์ฌ์ฉ |
| 11 | + - MainScheduler์์ ์คํ๋๋ฉฐ ์๋ฌ๋ฅผ catchํ๋ ํธ์ ๊ธฐ๋ฅ ์ ๊ณต |
| 12 | + - ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ๊ณต์ Observable์ ์์ฑํ์ฌ ์ค๋ณต ๊ตฌ๋
๋ฐฉ์ง |
| 13 | + |
| 14 | +- **Driver์ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฉ์ปค๋์ฆ** |
| 15 | + - ์
์ฌ์ฌ์ฉ ์ `disposeBag = DisposeBag()` ํธ์ถ๋ก ๊ฐ๋ณ ๊ตฌ๋
์ ํด์ ๋์ง๋ง |
| 16 | + - Driver์ ๊ณต์ Observable(`.whileConnected`)์ ๋ชจ๋ ๊ตฌ๋
์๊ฐ ํด์ ๋ ๋๊น์ง ์ ์ง |
| 17 | + - ๋น๋ฒํ ์
์์ฑ/ํด์ ํ๊ฒฝ์์๋ ๊ตฌ๋
์๊ฐ ์์ ํ 0์ด ๋๋ ์๊ฐ์ด ์์ด ๋์ ๋จ |
| 18 | + |
| 19 | +- **๋ฉ๋ชจ๋ฆฌ ๋์ ์ฆ์** |
| 20 | + ``` |
| 21 | + ShareReplay1WhileConnectedConnection<AVPlayerTimeControlStatus> |
| 22 | + CatchSink<ShareReplay1WhileConnectedConnection<AVPlayerTimeControlStatus>> |
| 23 | + AtomicInt (๋ค์) |
| 24 | + KVOObserver (๋ค์) |
| 25 | + ``` |
| 26 | + |
| 27 | +# ๊ณ ๋ฏผํ ์ / ํด๊ฒฐ๋ฐฉ๋ฒ |
| 28 | + |
| 29 | +- **๋ฌธ์ ์ํฉ** |
| 30 | + - NextHomeViewController ์คํฌ๋กค ์ ์ง์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ์ |
| 31 | + - SimpleVideoPlayerView์์ AVPlayer์ timeControlStatus ๊ตฌ๋
์ Driver ์ฌ์ฉ |
| 32 | + - ์ปฌ๋ ์
๋ทฐ ์
์ ๋น๋ฒํ ์ฌ์ฌ์ฉ์ผ๋ก ์ธํ ๋ฉ๋ชจ๋ฆฌ ๋์ |
| 33 | + |
| 34 | +- **์๋ํ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ๋ค** |
| 35 | + 1. **AVPlayer+Rx.swift KVO ์์ **: `observe()` โ `observeWeakly()` โ ์ด๋ฒคํธ ๋ฏธ๋ฐ์ |
| 36 | + 2. **์ง์ KVO ๊ตฌํ**: `player.observe(\.timeControlStatus)` โ ์ด๋ฒคํธ ๋ฏธ๋ฐ์ |
| 37 | + 3. **Observable.create๋ก ๋ํ**: ๋ณต์ก์ฑ ์ฆ๊ฐ ๋ฐ ํจ๊ณผ ์ ํ์ |
| 38 | + |
| 39 | +- **์ต์ข
ํด๊ฒฐ๋ฐฉ๋ฒ** |
| 40 | + ```swift |
| 41 | + // ๊ธฐ์กด ๋ฌธ์ ์ฝ๋ |
| 42 | + videoPlayer.rx.timeControlStatus |
| 43 | + .asDriver(onErrorJustReturn: .paused) // ๐จ Driver์ ๋ด๋ถ sharing |
| 44 | + .distinctUntilChanged() |
| 45 | + .drive(onNext: { ... }) |
| 46 | + |
| 47 | + // ์์ ๋ ์ฝ๋ |
| 48 | + videoPlayer.rx.timeControlStatus |
| 49 | + .distinctUntilChanged() |
| 50 | + .observe(on: MainScheduler.instance) // ๋ฉ์ธ ์ค๋ ๋ ๋ณด์ฅ |
| 51 | + .subscribe(onNext: { ... }) |
| 52 | + ``` |
| 53 | + |
| 54 | +- **ํต์ฌ ์๋ฆฌ** |
| 55 | + - Driver ์ ๊ฑฐ๋ก ๋ด๋ถ sharing ๋ฉ์ปค๋์ฆ ํํผ |
| 56 | + - ๊ฐ ์
๋ง๋ค ๋
๋ฆฝ์ ์ธ KVO ๊ตฌ๋
์์ฑ |
| 57 | + - `disposeBag = DisposeBag()` ์ ์์ ํ ๊ตฌ๋
ํด์ ๋ณด์ฅ |
| 58 | + |
| 59 | +# ๋๋์ |
| 60 | + |
| 61 | +- **RxCocoa์ ํธ์์ฑ๊ณผ ํจ์ ** |
| 62 | + - Driver, Signal ๋ฑ์ ํธ์ ๊ธฐ๋ฅ์ด ๋ด๋ถ์ ์ผ๋ก ๋ณต์กํ sharing ๋ฉ์ปค๋์ฆ ์ฌ์ฉ |
| 63 | + - ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ต์ ํ์ ๋์์ด ๋์ง๋ง, ํน์ ์ํฉ์์๋ ์คํ๋ ค ๋
์ด ๋ ์ ์์ |
| 64 | + - ๋จ์ํ "ํธ๋ฆฌํ๋ค"๋ ์ด์ ๋ก ๋ฌด๋ถ๋ณํ๊ฒ ์ฌ์ฉํ๋ฉด ์ ๋จ |
| 65 | + |
| 66 | +- **๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ณต์ก์ฑ** |
| 67 | + - `disposeBag = DisposeBag()`๋ง์ผ๋ก๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ํด๊ฒฐ๋์ง ์์ |
| 68 | + - RxSwift ๋ด๋ถ ๊ตฌํ์ ์ดํดํด์ผ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ํด๊ฒฐ ๊ฐ๋ฅ |
| 69 | + - Observable์ ๋ผ์ดํ์ฌ์ดํด๊ณผ sharing ๋ฉ์ปค๋์ฆ์ ๋ํ ๊น์ ์ดํด ํ์ |
| 70 | + |
| 71 | +- **์ ์ ํ ๋๊ตฌ ์ ํ์ ์ค์์ฑ** |
| 72 | + - ์ปฌ๋ ์
๋ทฐ ์
์ฒ๋ผ ๋น๋ฒํ ์์ฑ/ํด์ ๊ฐ ์ผ์ด๋๋ ํ๊ฒฝ์์๋ Driver๋ณด๋ค ์ผ๋ฐ Observable์ด ์ ํฉ |
| 73 | + - ์ํฉ์ ๋ง๋ ๋๊ตฌ ์ ํ์ด ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ์ง๊ฒฐ๋จ |
| 74 | + - ์ฝ๋์ "๊ฐ๊ฒฐํจ"๋ณด๋ค "์์ ์ฑ"์ด ์ฐ์ ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ |
| 75 | + |
| 76 | +--- |
| 77 | + |
| 78 | +# ์ฐธ๊ณ ๋งํฌ |
| 79 | + |
| 80 | +- [https://github.com/ReactiveX/RxSwift/blob/main/RxCocoa/Traits/Driver/Driver.swift](https://github.com/ReactiveX/RxSwift/blob/main/RxCocoa/Traits/Driver/Driver.swift) |
| 81 | +- [https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Traits.md](https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Traits.md) |
0 commit comments