RxCocoa란 Reactive한 형태를 Cocoa Framework에서도 사용할 수 있도록 하는 것을 말한다.
Cocoa Framework에는 Foundation, ApplicationKit(or UIKit) 등이 있다.
1. Binder<Value>
다음 도식을 살펴보자.
여기서 핵심은 데이터가 단방향으로 흐를 수 있도록 한다는 것이다.
UITextField에 글자를 쓰면 UILabel에 실시간으로 업데이트 되는 화면을 구현한다고 해보자. RxCocoa의 .bind(to: )를 사용하지 않는다면 다음과 같이 RxSwift만을 활용해 구현할 수 있다.
textField.rx.text
.observe(on: MainScheduler.instance)
.subscribe(onNext: {
label.text = $0
})
.disposed(by: disposeBag)
여기서 RxCocoa의 .bind(to: )를 사용하면, 위 코드를 더 간편하게 바꿀 수 있다. bind는 Main Thread에서 실행됨을 보장하기 때문에 윗 코드에서 작성했던 .observe(on: MainScheduler.instance)를 작성할 필요가 없다.
textField.rx.text
.bind(to: label.rx.text)
.disposed(by: disposeBag)
2. Driver<Element>와 Signal<Element>
에러를 방출하지 않는 특별한 Observable이다.
모든 과정은 Main Thread에서 이뤄지며 앞서 봤던 bind와 다르게 스트림 공유가 가능하다. 즉, 여러 개의 Observable을 만든다고 했을 때, bind는 각각의 스트림을 만들어서 사용하지만 RxCocoa의 Traits인 Driver와 Signal은 스트림을 공유하여 사용할 수 있다.
Driver는 초기값 || 최신값 Replay
Signal은 구독한 이후에 발생하는 값 전달
3. extension Reactive where Base: T {}
Rx가 Cocoa Framework의 모든 기능들을 제공하지 않을 수도 있고, 각 기능을 좀 더 커스텀하게 사용하고 싶을 때가 있다. 그럴 때 extension Reactive를 사용하면 된다.
extension Reactive where Base: UIView {
var sizeToFit: Binder<Void> {
return Binder(base) { base, _ in
base.sizeToFit()
}
}
}
extension으로 UIView의 sizeToFit을 구현한다면, 다음 예시처럼 사용할 수 있다.
Driver.just(Void())
.drive(button.rx.sizeToFit)
.disposed(by: disposeBag)
'Development > iOS' 카테고리의 다른 글
[iOS] RxSwift/RxCocoa/RxRelay - Subject와 Relay (0) | 2022.03.05 |
---|---|
[iOS] SnapKit (0) | 2022.03.03 |
[iOS] Grand Central Dispatch (GCD) (0) | 2022.02.28 |
[iOS] App Store 심사 지침 (0) | 2022.02.25 |
[iOS] RxSwift (0) | 2022.02.16 |