BehaviorSubject
๐ช BehaviorSubject โ ์ต์ ๊ฐ ๋ณด์กด Subject
ํต์ฌ ํค์๋: Last Emitted Value ยท Initial Seed ยท Hot Stream
BehaviorSubject<Element>
๋ ํญ์ ์ต์ ๊ฐ์ 1๊ฐ ์ ์ฅํ๊ณ , ์ ๊ตฌ๋
์์๊ฒ ์ฆ์ ์ ๋ฌํฉ๋๋ค. ์ด๊ธฐ๊ฐ(seed)์ ์๊ตฌํ๋ฏ๋ก ์ํ๋ฅผ ์ด๊ธฐํํด์ผ ํ๋ UX(ํ ๊ธ, ํผ ์
๋ ฅ ๋ฑ)์ ์ ํฉํฉ๋๋ค.
1๏ธโฃ ํน์ง ์์ฝ
์ด๊ธฐ๊ฐ
โ๏ธ ํ์ (init(value:)
)
์บ์ ํฌ๊ธฐ
1 (์ต์ ๊ฐ)
๊ตฌ๋ ์ ์ ๋ฌ
์ต์ ๊ฐ ์ฆ์ ๋ฐํ
์คํธ๋ฆผ ์ข ๋ฃ
.onCompleted()
๋๋ .onError()
์ ํ ํ ์บ์ ์ ๊ฑฐ
2๏ธโฃ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
let subject = BehaviorSubject(value: "๐ฆ Red")
let bag = DisposeBag()
// ์ฒซ ๊ตฌ๋
์ โ ์ด๊ธฐ๊ฐ ์ ๋ฌ
subject
.subscribe(onNext: { print("1๏ธโฃ",
$0) })
.disposed(by: bag)
subject.onNext("๐ก Yellow")
// ๋ ๋ฒ์งธ ๊ตฌ๋
์ โ ์ต์ ๊ฐ Yellow ์ ๋ฌ
subject
.subscribe(onNext: { print("2๏ธโฃ",
$0) })
.disposed(by: bag)
subject.onNext("๐ข Green")
์ถ๋ ฅ
1๏ธโฃ ๐ฆ Red
1๏ธโฃ ๐ก Yellow
2๏ธโฃ ๐ก Yellow
1๏ธโฃ ๐ข Green
2๏ธโฃ ๐ข Green
3๏ธโฃ ViewModel ์ํ ๋ณด์กด ์์ โ ๋ก๊ทธ์ธ ๋ฒํผ ํ์ฑํ
struct Input {
let email: Observable<String>
let password: Observable<String>
}
struct Output {
let isLoginEnabled: Observable<Bool>
}
func transform(input: Input) -> Output {
let isValid = Observable
.combineLatest(input.email, input.password)
.map { email, pw in email.contains("@") && pw.count >= 6 }
let enabledSubject = BehaviorSubject(value: false)
isValid
.bind(to: enabledSubject)
.disposed(by: bag)
return Output(isLoginEnabled: enabledSubject.asObservable())
}
BehaviorSubject
๊ฐ ์ต์ ์ ํจ์ฑ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑ โ ํ๋ฉด ์ฌ์ง์ ์ ์ฆ์ ๋ฐ์.
4๏ธโฃ vs PublishSubject ๋น๊ต
ํญ๋ชฉ
PublishSubject
BehaviorSubject
์ด๊ธฐ๊ฐ
์์
ํ์
์บ์
0
1
๊ตฌ๋ ์งํ ๊ฐ
โ
์ต์ 1๊ฐ
์ฌ์ฉ ์ฌ๋ก
๋จ์ ์ด๋ฒคํธ ๋ธ๋ก๋์บ์คํธ
UI ์ํ, ์ค์ ๊ฐ, ๋ฐ์ดํฐ ์บ์
5๏ธโฃ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ & ์๋ฌ ์ฒ๋ฆฌ
// ํ์ฌ ๊ฐ ์ฝ๊ธฐ
if let current = try? subject.value() {
print("Current ->", current)
}
// ์๋ฌ ๋ฐ์ ์ value() ํธ์ถ์ throw
subject.onError(MyError.invalid)
// try? subject.value() -> nil, ๊ตฌ๋
์ .error ์ฆ์ ์ ๋ฌ
value()
๋ Subject๊ฐ ์๋ฌ/์๋ฃ ์ํ๋ฉด throw ํ๋ฏ๋ก, ์ต์ ๋try?
ํจํด์ด ์์ ํฉ๋๋ค.
6๏ธโฃ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ & ์ฃผ์
Strong reference: BehaviorSubject๋ ๋ง์ง๋ง ๊ฐ ๋ณด์ โ ํฌ๊ธฐ๊ฐ ํฐ ๋ชจ๋ธ/์ด๋ฏธ์ง ์ ์ฅ ์ฃผ์.
State explosion: ๋๋ฌด ๋ง์ BehaviorSubject โ UI ์ํ ๋ถ์ฐ, Relay ๋๋
combineLatest
๋ก ๊ตฌ์กฐํ.Thread safety: ๋ค์ค ์ฐ๋ ๋
onNext
์ Data Race ๊ฐ๋ฅ โ Serial Scheduler, Actor ํ์ฉ.
7๏ธโฃ Mini Quiz
BehaviorSubject
๋ฅผ.onCompleted()
ํ ๋ค์onNext
ํธ์ถํ๋ฉด?์บ์๋ ์ต์ ๊ฐ์ด ํฌ๊ธฐ๊ฐ ํฐ ์ด๋ฏธ์ง๋ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ๋ฒ ๋ ๊ฐ์ง๋?
Combine ํ๋ ์์ํฌ์์ ๋น์ทํ ์ปจ์ ์ ๋ฌด์์ธ๊ฐ?
๋ค์ ๋ฌธ์ โถ๏ธ ReplaySubject ๋ก ๋์ด๊ฐ ๋ค์ค ๊ฐ ์บ์ ์ ๋ต์ ์ดํด๋ด ๋๋ค. ๐
Last updated