# [RxCocoa] RxSwift + RxCocoa Useful tips
RxSwift + RxCocoa 사용할 경우, 유용하게 사용할 수 있는 간단한 함수들 정리
# .bindNext
UIButton Tap의 이벤트를 받을 때마다 함수 실행하게 해주는 sugar.
func reload() {
}
func setup() {
reloadButton.rx.tap
//.subscribe(onNext: { [weak self] in self?.reload()})
.bindNext(reload)
.disposed(by: disposeBag)
}
실제로 RxSwift로 버튼을 다음과 구현한다면, 탭의 리로드할 때 함수가 여러번 불리게 될 수 있기 때문에 다음과 같이 작성하여야 한다.
func reload() {
}
func setup() {
reloadButton.rx.tap
.debounce(0.3, scheduler: MainScheduler.instance)
//debounce 함수로 일정 시간 안에 불리는 것은 무시할 수도 있습니다
.map { !$0 }
.do(onNext: {
print("Reload Button Tapped")
Analytics.buttonReload.send()
//중간에 이벤트에 대한 로그를 넣을 수도 있다.
})
.bindNext(reload)
.disposed(by: disposeBag)
}
UI 말고도 앱에서는 네트워크 이벤트를 많이 사용하는데, 동기적으로 사용하면 UI가 블럭되거나, 스레드에서 처리하더라도 UI로 넘어갈 때 괴로움을 많이 겪게 됩니다. 이런 어려움도 RxSwift + .bindNext로 해결할 수 있다.
func reload() {
API.default.request(.getPage)
.map { json in Page(json: json)}
.observe(on: MainScheduler.instance)
//.subscribe(onNext: { [weak self] page in
// self?.display(page: page)
//})
.bindNext(display)
.disposed(by: disposeBag)
}
getPage라는 API 요청을 보내면 JSON 형태의 옵저버블이 나오는 예제. map으로 JSON을 Page로 변환하는 체이닝 메서드를 붙이고, 구독을 해서 Page를 이용해서 디스플레이를 하는 로직을 붙일 수 있다. 이 코드를 더 swift를 통해 축약을 하면 다음과 같이 만들 수 있다.
func reload() {
API.default.request(.getPage)
.map { Page(json: $0)}
.observe(on: MainScheduler.instance)
.bindNext(display)
.disposed(by: disposeBag)
}
# replacingOccurrences
String 형식의 event 중에서 원하는 문자를 바꿀 수 있다.
Observable.Just|(“800x600”)
.map{$0.replacingOccurrences(9f: “x”, with: “/“)} // 800/600
.subscribeOn(ConcurrentDispatchQueueScheduler(sos: .default))
.observeOn(MainScheduler.instance)
.subscribe(onNext: self.imageView.image = $0 }