최근 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인자를 통해 에러가 발생했을 때 예외처리를 할 수 있습니다.
'iOS' 카테고리의 다른 글
[iOS/Swift] 스토리보드 없이 UIScrollView 만들기 (using Snapkit) (2) | 2020.02.04 |
---|---|
[iOS13] 스토리보드 없이 프로젝트 시작하기 (0) | 2020.01.26 |
아이폰 다양한 해상도 비율에 맞게 AutoLayout 그리기(with SnapKit) (0) | 2020.01.14 |
[iOS/Swift] UIButton생성과 이벤트 핸들러 정의 (without stroyboard) (0) | 2019.07.16 |
[iOS] 커스텀 폰트 적용하기 (Swift) (0) | 2019.07.14 |