Swift - RxCocoa
RxCocoa
RxCocoa란 기존 Cocoa Framework에 Rx기능을 합친 RxSwift기반의 라이브러리 입니다.
RxSwift와 별도로 추가해주어야 사용할 수 있습니다
RxCocoa는 단방향성을 갖고 있습니다
Producer는 값을 생성하고, Consumer는 값을 처리 합니다.
ObserverType,ObservableType
두개의 Type 성질을 알고 이해해야 합니다.
-
observableType : 값을 관찰할수 있습니다.
-
observerType : 값을 주입시킵니다.
Binder
먼저 bind를 이해하기 위해선 Binder를 이해해야 합니다.
Binder는 옵저버 타입으로 3가지 특징이 있습니다.
- 반드시 메인스케쥴러에서 실행된다는 것입니다.
- 에러 이벤트를 따로 방출하지 않고 로그로만 출력됩니다.
- 옵저버타입이기 때문에 새로운 값을 전달할 수 있지만 구독자를 추가할 수는 없습니다.
bind
public func bind<Observer: ObserverType>(to observers: Observer...) -> Disposable where Observer.Element == Element {
self.subscribe { event in
observers.forEach { $0.on(event) }
}
}
bind 는 subscribe 와 동일한 기능이라고 말할수 있습니다.
실제 bind 구현 자체에서도 subscrbie 를 사용하고 있습니다.
하지만 조금 다른점은
RxSwift 에서의 subscribe 는
Observable 이 방출하는 Event 를 Observer 가 subscribe 하여 관찰할수 있습니다.
RxCocoa bind 는
Observable 과 Observer 의 관계를 하나로 묶는 다는 개념이 있습니다.
코드의 차이점
subscribe
tf.rx.text
.observe(on: MainScheduler.instance)
.subscribe(with: self , onNext: { ( _ , str ) in
self.lb.text = str
}).disposed(by: disposBag)
bind
tf.rx.text
.bind(to: lb.rx.text)
.disposed(by: disposBag)
이처럼 UI를 Controll 하는데 있어 Rxcocoa 를 사용하는것이 조금더 우위에 있습니다.(가독성 등에도 차이가 있는듯 하다).
또한 값을 주입하기 때문에 순환참조에서도 벗어날수 있습니다.
bind 는 binder 되어 있는 Property의 값을 전달받아 주입하기 때문에 따로 메모리릭에 대비하지 않아도 됩니다.
Traits
RxCocoa의 Trait(UI작업시 코드를 쉽고 직관적으로 작성해 사용할 수 있도록 도와주는 특별한 Observable클래스 모음)
-
error를 방출하지 않습니다
-
MainScheduler 에서 subscribe 됩니다.
(scheduler 를 통한 Thread 지정할 필요없습니다) -
signal 을 제외한 나머지들은 자원을 공유합니다
Trait 종류
ControlProperty (ObservableType,ObserverType)
Subject 와 비슷합니다.
-
ControlProperty는 ControlPropertyType을 준수하고, ControlPropertyType은 ObservableType과 ObserverType을 준수합니다.
-
컨트롤에 data를 binding하기 위해 사용합니다.(rx namespace 사용)
-
error 를 방출하지 않습니다.
let blue = tf2.rx.text.orEmpty.map { $0.contains("파랑") }
blue
.distinctUntilChanged() //값이 변경될때만 방출
.subscribe(with: self,onNext: { _ , value in
self.lb.text = String(value)
}).disposed(by: disposBag)
ControlEvent( ObserverType )
- 컨트롤의 event를 수신하기 위해 사용합니다.
-
MainScheduler 에 전달합니다.
-
Observable 의 역할을 수행하지 못합니다.
Driver : error를 방출하지 않고 메인스레드에서 처리됩니다.
Signal : Driver와 유사하지만 자원을 공유하지않습니다. (Signal은 event모델링에 유용, Driver는 state모델링에 더 적합합니다.)
Dirver
-
error 를 전달하지 않습니다.
-
Scheduler 를 통한 Thread 변경이 되지 않는 이상 MainThread 에서 작업 됩니다.
-
Observable share 를 통한 공유처럼 공유가 가능합니다.
-
구독이 이루어지면 가장 최근에 발생한 Event 가 전달된다.
선언에 대하여
let result2 = Observable<Int>.of(Int.random(in: 11..<21))
.observe(on: MainScheduler.instance)
.catchAndReturn(100)
.map { String($0) }
.share()
result2
.subscribe(with:self,onNext: { _ , str in
self.lb.text = str
}).disposed(by: disposBag)
result2
.subscribe(with:self,onNext: { _ , str in
self.lb2.text = str
}).disposed(by: disposBag)
subscribe 사용시에는 설정해주어야 할것들이 많다.
let result = Observable<Int>.of(Int.random(in: 11..<21))
.asDriver(onErrorJustReturn: 100)
.map { String($0) }
result
.drive(lb.rx.text)
.disposed(by: disposBag)
result
.drive(lb2.rx.text)
.disposed(by: disposBag)
Author And Source
이 문제에 관하여(Swift - RxCocoa), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@leejinseong9410/RxSwift-RxCocoa저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)