Tags :

Date :

비동기 이벤트 예시

  • 버튼의 클릭을 나타내는 UIButton의 Tap 이벤트는 비동기 이벤트로, 데이터의 변화에 대해 관찰이 가능한 형태다.
  • RxSwift에서 이를 Observable 형태로 만들 수 있다.

Observable

public class Observable<Element>: ObservableType {}
  • 관찰이 가능한 흐름으로, 비동기 이벤트의 시퀀스를 생성할 수 있는 대상을 말한다.
  • 비동기 이벤트를 어떤 관찰 가능한 타입으로 만든다 == 비동기 이벤트를 제네릭 타입의 Observable이란 클래스의 인스턴스로 만든다는 것이다
  • 이벤트가 발생시 이를 알리기 위해 그 이벤트에 대한 항목을 시퀀스로 방출한다 이를 obser가 받는다

Observer

  • Observer는 Observable을 구독한다
  • Observer는 내가 원하는 비동기 이벤트를 방출하는 Observable을 구독할 경우
    그 Observable이 비동기 이벤트가 실행되어 항목(item)이 방출되면 그 항목을 받을 수 있다.
  • Observer가 Observable을 구독할 수 있게 해주는 것이 Subscrive라는 메서드다.

Subscribe

public func subscribe(
    onNext: ((Element) -> Void)? = nil,      // 구독하려는 Observable이 항목(item)을 방출 시 어떤 작업을 할 것인지
    onError: ((Swift.Error) -> Void)? = nil, // 해당 Observable이 오류 발생 시 어떤 작업을 할 것인지
    onCompleted: (() -> Void)? = nil,        // 더 이상 이벤트 발생하지 않고 종료됐을 때 어떤 작업을 할 것인지
    onDisposed: (() -> Void)? = nil         
) -> Disposable

UIButton 클릭 이벤트 예시(Observable, Observer, Subscribe

sodeulButton
    .rx
    .tap
    .subscribe(onNext: {
        print("Observable이 항목을 방출 했다!")
    },
    onError: { error in
        print("에러가 발생 했다!")
    },
    onCompleted: {
        print("해당 이벤트가 끝났다!")
    })
    .disposed(by: disposedBag)
  • tap 이벤트 발생 시 subscribe(onNext:…)를 통해 “구독”을 해서 해당 Observable이 방출하는 항목에 대해 받을 수 있다.
  • 이 메서드의 파라미터로 아래 3가지를 각각 넘겨줄 수 있다.
    • onNext(항목이 방출 됐을 때, 즉 버튼이 눌렸을 때 실행시킬 클로저)
    • onError(에러가 발생 했을 때 실행시킬 클로저)
    • onCompleted(이벤트가 종료됐을 때 실행시킬 클로저)

subscribe 메서드를 사용하면 메서드 내부에서 Observer를 자체적으로 생성한다.

// 자체적으로 AnnonymousObserver라는 것을 생성해서 해당 Observable에 subscribe를 해준다.
let observer = AnnonymousObserver<Element> { ... }
return Disposables.create(
    self.asObservable().subscribe(observer),
    disposable
)
  • subscribe(onNext:…) 메서드를 사용할 경우, 메서드 내부에서 옵저버를 자체적으로 생성해서
    우리가 직접 Observer를 생성하지 않고 파라미터로 클로저만 넘겨줘도 Observable을 구독하여 방출하는 항목을 받을 수 있게 된다.

Reference

  • https://babbab2.tistory.com/182
  • https://babbab2.tistory.com/185