[Global States]
ReactorKit은 Global state에 대한 정의를 강제하지 않는다.
BehaviorSubject, PublishSubject등 자유롭게 선택하면 된다.
Global State는 transform()를 통해, 기존 상태와 결합되어 사용될 수 있다.
예를 들어, 사용자의 ‘cellular data 사용 여부’와 같은 정보는 여러 리액터에서 변경될 수 있고, 그 상태를 동기화 시켜야한다.
각 리액터에서 상태가 변경될 때마다 이를 전역 상태로 반영하고, 다른 리액터에서는 전역 상태를 구독하여 동일한 정보를 사용할 수 있게 된다.
var currentUser: BehaviorSubject<User> // global state
func transform(mutation: Observable<Mutation>) -> Observable<Mutation> {
return Observable.merge(mutation, currentUser.map(Mutation.setUser))
}
[View Communication]
뷰 간의 통신은 클로저를 통한 콜백 함수 또는 델리게이트 패턴 등이 주로 사용된다.
ReactorKit은 reactive extensions을 통해 뷰 간의 소통을 추천한다.

메세지를 보여주는 ChatViewController가 있다고 가정.
ChatViewController는 MessageInputView를 소유한다.
유저가 MessageInputView의 버튼을 클릭하면 텍스트가 ChatViewController에 전송됨.
extension Reactive where Base: MessageInputView {
var sendButtonTap: ControlEvent<String> {
let source = base.sendButton.rx.tap.withLatestFrom(...)
return ControlEvent(events: source)
}
}
messageInputView.rx.sendButtonTap
.map(Reactor.Action.send)
.bind(to: reactor.action)