[RxSwift] 개념 정리

JIN WOO Park (PFXStudio)
6 min readFeb 11, 2020

--

용어가 자꾸 헷갈려 정리하게 되었다.

RxSwift는 데이터 변화에 반응하며 순차적으로 변화에 따른 처리를 함으로써 비동기 프로그래밍을 쉽게 구현하도록 도와준다.

예를 들어 프로필 정보 업데이트 순서를 생각 해 보자.

  1. 클라이언트에서 서버로 프로필 업데이트 정보 요청
  2. 서버는 유저 정보 확인 후 프로필 정보 업데이트 후 클라이언트에게 응답 정보 전송
  3. 클라이언트는 업데이트 된 프로필 정보를 받아 화면에 정보 업데이트

위 순서대로 로직이 진행 될 것이다.

이때 서버로 부터 언제 응답이 올지 모르기 때문에 마냥 대기 할 순 없다. 이럴 때 비동기로 코드를 작성한다고 하여 비동기 프로그래밍이라 부르며 프로필 정보가 변경되면 바로 반응하여 화면에 프로필 정보가 업데이트 된다고 보면 된다.

이 과정을 RxSwift는 쉽게 코드를 작성 할 수 있게 도와주는 역할을 한다.

Rx의 세가지 구성요소

Observable

  • 이벤트 시퀀스를 비동기적으로 생성한다.
  • 이벤트를 발생할 수 있고, 이벤트를 관찰할 수 있다.
  • 이벤트 발생을 emit 이라고 부르며 이벤트 발생 시 전달 할 값을 포함 할 수 있다.
  • emit은 next(최신 값을 전송하는 이벤트), error(에러가 발생 했을 때 이벤트), complete(성공적으로 이벤트 시퀀스를 종료 시키는 이벤트)를 방출한다.
  • 이벤트 관찰은 subscribe를 하여 이벤트가 발생 할 때 마다 관찰 할 수 있다.
  • subscribe를 하면 Disposable을 반환하게 되며 이벤트 관찰을 취소 하고 싶을 경우 반환된 Disposable에 .dispose()를 호출하면 관찰 취소가 된다.
  • 이벤트 관찰이 여러개일 경우 모두 다 관리하기 힘들기 때문에 한꺼번에 관리를 하기 위해 DisposeBag()을 제공한다.
  • deinit() 시점에 DisposeBag() 변수에 재 생성하여 할당 해 주면 모든 관찰이 취소가 된다.

deinit { self.disposeBag = DisposeBag() }

  • Observable보다 좁은 범위의 Observable인 Trait을 제공한다.
  • Trait 종류는 Single, Maybe, Completable이 있다.
  • Single은 .success(value), .error 이벤트만 방출한다. HTTP 요청 응답처럼 하나의 이벤트 처리가 필요할 때 사용된다.
  • Completable은 결과값이 필요하지 않고 .completed, .error 완료 이벤트 처리가 필요할 때 사용된다.
  • Maybe는 Single과 Completable을 섞어 놓은 것이며 .success(value), .error, completed 중 하나의 이벤트만 필요할 때 사용된다.
  • Hot Observable 관찰(.subscribe)를 하지 않아도 생성과 동시에 이벤트가 방출 되는 것이고 Cold Observable은 관찰(.subscribe)을 한 시점부터 이벤트가 방출 된다.

Operator

  • 이벤트 관찰 시 넘어오는 이벤트 값을 거르거나 변형을 하거나 순서 및 조합이 필요한 경우(filtering, transforming, combining)를 위해 사용한다.
  • Filtering operators 는 특정 조건에 따라 이벤트를 걸러낸다.

ignoreElements()
elementAt()
filter()
skip()
skipWhile()
skipUntil()
take()
takeWhile()
takeUntil()
distinctUntilChanged()

  • Transforming Operators는 이벤트 값을 조작할 때 사용한다.

toArray()
map()
flatMap()
flatMapLatest()
materialize()
dematerialize()

  • Combining Operators는 이벤트 순서 및 조합이 필요한 경우 사용한다.

startWith()
concat()
concatMap()
merge()
zip()
combineLatest()
withLatestFrom()
switchLatest()
flatMapLatest()
reduce()
scan()

각각의 operator에 대한 기능 설명은 따로 작성 할 예정…

Schedulers

  • Dispatch Queue와 동일하게 쓰레드를 직접 관리하지 않고 Rx에 쓰레드 관리를 맡기는 것이다.
  • 작업이 오래 걸리는 로직은 백그라운드 쓰레드에서 진행 하도록 할 수 있으며 화면 업데이트가 필요한 경우 메인 쓰레드로 변경하여 업데이트를 할 수 있다.
  • .subscribeOn(MainScheduler.instance)이 메인 쓰레드
  • .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background)) 백그라운드 쓰레드

RxCocoa

UIKit, Cocoa 기반 클래스에 Rx 기능을 추가한 라이브러리이다.

UIButton의 경우 버튼 탭 이벤트 함수를 따로 만들 필요없이

button.rx.tap.subscribe(onNext: { _ in print(“tap!!”)})

위와 같이 버튼 탭 이벤트 코드 작성이 가능하다.

Subject

Observable에 값을 추가하고 Subscriber에게 이벤트 방출이 둘다 필요한 경우 사용된다.

  • PublishSubject은 .subscribe 이후부터 이벤트를 방출하며 .completed, .error 이벤트가 방출 될 때까지 지속된다.(정보 업데이트가 필요 할 때 사용한다.)
  • BehaviorSubject는 PublishSubject와 유사한 기능이지만 초기 값을 갖는 Subject이다. .subscribe가 되면 가장 최신의 값을 .next로 전달 받는다.(컬렉션이나 테이블 리스팅 할 때 유용하다.)
  • ReplaySubject는 버퍼 사이즈 만큼의 이벤트를 저장 해 두었다가 .subscribe 가 될 때 쌓인 이벤트를 모두 방출하는 Subject이다. (최신 검색어 리스트 목록을 보여 줄 때 유용하다.)

공부하면서 제 생각을 기재 해 놓은거라 틀린 사항이 있을 수도 있습니다…

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

No responses yet

Write a response