본문 바로가기

iOS

[RxSwift, RxCocoa] bind와 subscirbe의 차이점

최근 RxSwift를 사용하여 iOS개발을 하다가 생긴 궁금증이였습니다.
RxSwift를 사용하면 UIButton의 탭 이벤트, UITextField의 text change 이벤트들을 스트림으로 받아서 처리를 할 수 있습니다.
특히나 가장 보편적인 이벤트 스트림은 아래와 같은 탭 이벤트 입니다.

override func viewDidload() {
	// 버튼 탭 바인딩
        myPageView.modifyBtn.rx.tap.bind {
            print("Modify button was tapped")
        }.disposed(by: disposeBag)
}

가장 기본적인 예제로 modifyBtn이란 UIButton을 눌렀을 때, 콘솔창에 문자열을 출력하는 로직입니다.
이때 bind(onNext:@escaping(Self.Element) ->Void) 함수를 사용하여 이벤트를 처리하곤 했습니다.
하지만 stackoverflow를 보다보니 subscribe(onNext: ((Self.Element) ->Void)? =nil, onError: ((Error) ->Void)? =nil, onCompleted: (() ->Void)? =nil, onDisposed: (() ->Void)? = nil) 함수를 사용해서 이벤트를 처리하는 사람들도 발견했습니다.

 

bind(onNext: @escaping(Self.Element) -> Void) 정의

/**
	Subscribes an element handler to an observable sequence.
	In case error occurs in debug mode, `fatalError` will be raised.
	In case error occurs in release mode, `error` will be logged.
    
	- parameter onNext: Action to invoke for each element in the observable sequence.
	- returns: Subscription object used to unsubscribe from the observable sequence.
*/
public func bind(onNext: @escaping (Self.Element) -> Void) -> RxSwift.Disposable

설명은 똑같이 subscribe한다고 나와있습니다.
다만, 디버그 모드에서 에러가 발생할 경우 "fatalError"가 발생하고 릴리즈 모드에서에서 에러가 발생할 경우 일반 "error"가 기록됩니다.

 

subscribe(onNext: ...)정의

/**
	Subscribes an element handler, an error handler, a completion handler and disposed handler to an observable sequence.
     
	- parameter onNext: Action to invoke for each element in the observable sequence.
	- parameter onError: Action to invoke upon errored termination of the observable sequence.
	- parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.
	- parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has
		gracefully completed, errored, or if the generation is canceled by disposing subscription).
	- returns: Subscription object used to unsubscribe from the observable sequence.
*/
public func subscribe(onNext: ((Self.Element) -> Void)? = nil, onError: ((Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil) -> RxSwift.Disposable

subscribe의 경우 말그대로 이벤트를 subscribe를 하는 함수이고 인자로 onNext뿐만 아니라 onError, onCompleted까지 클로저로 받습니다. bind와 달리 error를 컨트롤 할 수 있는 차이점이 존재합니다.

 

결론

bind와 subscribe의 차이점은 error를 컨트롤 할 수 있냐 없냐 입니다.
bind의 경우 error가 발생했을때 처리하는 구문이 없이 에러가 발생하고 subscribe를 사용할 경우 onError인자를 통해 에러가 발생했을 때 예외처리를 할 수 있습니다.