๋ค์ด๊ฐ๋ฉฐ
๊ธฐ๋ก์ ์์คํจ์ ์๋ฉด์๋ ๋ฌด์ธ๊ฐ๋ฅผ ๊พธ์คํ ๊ธฐ๋กํ๋ค๋ ๊ฒ์ ์ฐธ ์ด๋ ค์ด ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฐ์ ๋ฐ ์๊ฐ์ ๋ง์ด ํ์ง๋ง ๊ทธ๋ฅ ํ๊ณ๋์ง๋ง๊ณ , ๋ช ์๋ผ๋ ๋จ๊ฒจ๋๋ ๊ฒ์ด ์ค์ํ๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ ธ์ต๋๋ค. ๊น์ด ์๋ ๊ธ์ ๋ฌ์ 1~2๋ฒ ์ ๋ ์ ๋ ๊ฒ์ผ๋ก ํ๊ณ ์ฐ์ ์ ๊พธ์คํ ๋ฉ๋ชจ(ex. ํค์๋, ์์ฝ ๋ฑ)๋ฅผ ํ๋ ์์ผ๋ก ๊ฐ๋ณด๋ ค๊ณ ํด์. ๊นํ๋ธ์ ๊ธฐ๋กํ๋ ๊ฒ์ด ํธํด์ ๋ณดํต ๋ฉ๋ชจ๋ ๊ธฐ๋ก์ ๊นํ๋ธ์ ํ๋ ํธ์ด์ง๋ง, ์์ผ๋ก ๋ธ๋ก๊ทธ์๋ ๋์์ ๊พธ์คํ ํฌ์คํ ํ ์๊ฐ์ ๋๋ค. ํ์ดํ !!
Disposable
RxSwift > Disposable
// Disposable.swift
/// Represents a disposable resource.
public protocol Disposable {
/// Dispose resource.
func dispose()
}
- '์ฒ๋ฆฌํ ์ ์๋'์ ์ฌ์ ์ ์๋ฏธ๋ฅผ ์ง๋๋๋ค.
- protocol ํ์ ์ ๋๋ค.
- dispose() ๋ฉ์๋๊ฐ ์ ์ธ๋์ด ์์ต๋๋ค.
// ObservableType+Extensions.swift
public func subscribe(
onNext: ((Element) -> Void)? = nil,
onError: ((Swift.Error) -> Void)? = nil,
onCompleted: (() -> Void)? = nil,
onDisposed: (() -> Void)? = nil
) -> Disposable { ... }
- Observable์ subscribe(๊ตฌ๋ )์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋ชจ๋ subscription ๊ฐ์ฒด๋ Disposable ํฉ๋๋ค.
- Disposable ํ๋ค๋ ๊ฒ์ ํต์ฌ์ dispose๋ฅผ ์ํํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๐ ํต์ฌ์ Disposableํ ๊ฐ์ฒด๋ dispose๋ฅผ ์ํํจ์ผ๋ก์จ '๋ฆฌ์์ค ์ ๋ฆฌ'์ '๊ตฌ๋
์ทจ์'๋ฅผ ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
DisposeBag
// 1. ์ต์ ๋ฒ๋ธ(์ด๋ฒคํธ ๋ฐฉ์ถ)
let observable = Observable.just("RxSwift")
// 2. ๊ตฌ๋
์(๊ตฌ๋
ํ๋ ์์ ๋ถํฐ ์ต์ ๋ฒ๋ธ์ด ๋ฐฉ์ถํ๋ ์์๋ฅผ ๋ฐ์๋ณผ ์ ์์)
let subsriber1 = observable
.subscribe(onNext: { element in
print(element)
})
let subsriber2 = observable
.subscribe(onNext: { element in
print(element)
})
// 3. ๊ตฌ๋
์ทจ์
subsriber1.dispose()
subsriber2.dispose()
์ฐ๋ฆฌ๋ ์ํ์ค๋ฅผ ๊ฐ๊ฐ dispose ๋ฉ์๋๋ฅผ ํตํด ๊ตฌ๋ ์ทจ์ ํด์ค ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ๋ก๋ฐ๋ก ๊ตฌ๋ ์ทจ์๋ฅผ ํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋กญ๊ธฐ๋ ํ๊ณ , ์ํ์ค๊ฐ ์ฌ๋ฌ ๊ฐ๊ฐ ์์ ๋๋ ๊ตฌ๋ ์ทจ์ ํ๋ ๊ฒ์ ๋์น ์๋ ์์ฃ . ๊ทธ๋ ๊ธฐ์ RxSwift์์ ์ข ๋ ํธํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
DisposeBag
๋ฐ๋ก Disposableํ ๊ฒ์ ๋ด์ ์ ์๋ ๊ฐ๋ฐฉ(Bag)์ ์ ๊ณตํ๋๋ฐ์. ์ฐ๋ฆฌ๊ฐ ์ํ์ค๋ฅผ ์ผ์ผ์ด ๊ตฌ๋ ์ทจ์ ํ๋ ๊ฒ์ ๋์น ์ ์์ผ๋๊น '๊ทธ๋ฅ DisposeBag์ ๋ชจ์์ ๋ด์๋, ๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๊ฐ ์์์ dispose ํด์ค๊ฒ!' ์ด๋ฐ ์๋ฏธ์ ๋๋ค.
let disposeBag = DisposeBag()
- ๋ค์๊ณผ ๊ฐ์ด DisposeBag ๊ฐ์ฒด๋ฅผ ์ ์ญ ๋ณ์๋ก ๋ง๋ค์ด๋๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๊ด๋ก์ ์ผ๋ก disposeBag ๋ณ์๋ช ์ ์ฐ๋ ๊ฒ ๊ฐ์์.
// 1. ์ต์ ๋ฒ๋ธ(์ด๋ฒคํธ ๋ฐฉ์ถ)
let observable = Observable.just("RxSwift")
// 2. ๊ตฌ๋
์(๊ตฌ๋
ํ๋ ์์ ๋ถํฐ ์ต์ ๋ฒ๋ธ์ด ๋ฐฉ์ถํ๋ ์์๋ฅผ ๋ฐ์๋ณผ ์ ์์)
let subsriber1 = observable
.subscribe(onNext: { element in
print(element)
}).dispose(by: disposeBag)
let subsriber2 = observable
.subscribe(onNext: { element in
print(element)
}).dispose(by: disposeBag)
- ๊ฐ ์ํ์ค์ ๋ง๋ฏธ๋ฅผ ๋ณด๋ฉด disposeBag์ ๋ด์๋์ ๊ฒ์ด ๋ณด์ด์๋์.
- subscriptionํ ๊ฐ์ฒด๋ค์ ์ด๋ ๊ฒ disposeBag์ ๋ด์๋๊ฒ ๋ค๋ ๊ฒ์ ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ํด์
let disposeBag = DisposeBag()
- ์ดํ์ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ deinit ๋ ๋ disposeBag ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ฉด์ ๊ทธ ์์์ ๊ด๋ฆฌ๋๊ณ ์๋ Disposableํ ์์๋ค ์ญ์ ํด์ ๊ฐ ๋๊ฒ ๋ฉ๋๋ค.
- ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ํ ์ผ ๋๋ฌ์ผ๋ disposeBag๋ณด๊ณ ๋ ๋๋ผ๊ณ ํ๋๊ฑฐ์ฃ . ๊ทธ๋ผ disposeBag๊ฐ ๋ฐ๋ฆฌ๊ณ ์๋ ์์๋ค๋ ๊ฐ์ด ๋ ๋ ์๋ฐ์ ์๊ฒ ์ฃ ...?
var disposeBag: DisposeBag?
...
disposeBag = nil
- nil์ ๋ฃ์ด์ค์ ํด์ ํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
var disposeBag = DisposeBag()
...
self.disposeBag = DisposeBag()
- subscribe ์ค์ด๋ Disposables๋ฅผ ์ด๊ธฐํํด์ฃผ๊ณ ์ถ์ ๋ ์๋ก์ด DisposeBag ์ธ์คํด์ค๋ฅผ ๋ฃ์ด์ค ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ธฐ์กด์ ๋ฆฌ์์ค๋ฅผ ํ ๋ฒ์ ์ ๋ฆฌํด์ค ์ ์๊ฒ ๋ฉ๋๋ค. disposeBag์ด ํด์ ๋๋ ๊ฒ๊ณผ ๊ฐ์ ์๋ฆฌ์ ๋๋ค.