[RxSwift] Asynchronus ,Observables

kimdocs...📄·2021년 4월 26일
0

📢 keywords

asynchronus(비동기)
observable(관찰 가능한)
functional(함수의)
via schedulers(스케줄러를 통해)

📡 RxSwift

RxSwift는 '본질적'으로 코드가 '새로운 데이터에 반응'하고 '순차적으로 분리 된' 방식으로 처리함으로써 '비동기식' 프로그램 개발을 간소화합니다.

📎 Asynchronus 비동기

  • Asynchronous
    사전적으로 "동시에 발생하지 않는" 이라는 의미를 가지고 있습니다.
    즉 iOS에서는 한 가지 일을 처리하는 동시에 다른 일도 함께 처리하는 것을 말합니다.

  • iOS 개발 안에서 비동기 프로그래밍이 쓰이는 경우
    - 버튼을 눌렀을 때 이벤트 반응
    - 텍스트 필드에 포커스가 잡힌 경우
    - 인터넷에서 크기가 큰 이미지 파일을 받는 경우
    - 디스크에 데이터를 저장하는 경우
    - 오디오를 실행하는 경우

  • RxSwift 이전 경험했던 비동기 프로그래밍
    (Apple은 iOS SDK 내에서 비동기식 코드를 작성할 수 있도록 다양한 API를 제공하고 있어요!)
    - NotificationCenter
    - Delegate 패턴
    - Closures
    - Grand Central Dispath(GCD)

일반적으로 대부분의 클래스들은 비동기적으로 작업을 수행하고 모든 UI 구성 요소들은 본질적으로 비동기적으로 동작합니다.
따라서 내가 어떤 앱 코드를 작성했을 때 정확히 매번 어떤 순서로 작동하는 지 가정하는 것은 불가능하겠죠!
결국!✨ 앱의 코드는 사용자 입력, 네트워크 활동 또는 기타 OS 이벤트와 같은 다양한 외부 요인에 따라 완전히 다른 순서로 실행될 수 있습니다.

Apple의 SDK내의 API를 통한 복합적인 비동기 코드는 부분별로 나눠서 쓰기 매우 어려울 수 밖에 없고 추적 불가합니다.

RxSwift의 필요성

  1. 앱의 state를 관리하는 것
  2. (부수 작용)이슈를 추적 가능하게 해줍니다.
  3. 명령형 프로그래밍을 도와줍니다.
    • 하지만 인간이 일일이 명령하기에는 한계가 있음 & 인간은 실수를 할 수 있겠죠!
  4. 명령형 프로그래밍에서의 상태변화는 자유자재로 가능하게 해줍니다.
    • 함수형 코드에서는 부수작용을 일으킬 수 없습니다.
    • RxSwift = 명령형 프로그래밍 + 함수형 프로그래밍 (자유로운 상태변화 + 추적 가능한 결과값)
    • 변경 불가능 한 데이터로 작업하고 순차적이고 결과론적인 방식으로 코드 실행이 가능합니다.

📎 RxSwift의 구성 요소

✔️ Observables (생산자)

  • 다른 클래스에서 만든 값을 시간에 따라 읽을 수 있도록 해줍니다.
  • 하나 이상의 observers(관찰자)가 실시간으로 어떤 이벤트에 반응하고 앱 UI를 업데이트 하거나 생성하는 지를 처리하고 활용할 수 있게 해줍니다.
  • observer가 observable을 구독하는 형태로 이루어져있습니다.

옵저버는 Subscribe메서드를 통해서 Observable을 구독하고 onNext, onError, onCompleted라는 메소드를 구현하게 됩니다.

  • onNext : Observable이 배출하는 값을 파라미터로 전달받는다. (next를 전달 받음)
  • onError : Observable이 원하던 값이 아니거나 오류가 발생하면 이 메서드를 호출하고 오류 정보 객체를 파라미터로 전달받고 onNextonCompleted메서드는 호출되지 않는다.(error를 전달 받음)
  • onCompleted : Observable은 제일 마지막에 이 메소드를 호출한다.(completed를 전달 받음)

📢 Subscribe가 호출되기 전까지 Observable은 선언만 된 상태이기 때문에 어떠한 event도 일어나지 않아요!
즉, subscribe가 호출되어야만 observable이 생성되는 것!
subscribe는 Observable의 stream을 구독(관찰) 하는 역할을 합니다.

🛠Observable sequence

1) Finite observable sequences
: 값을 방출한 뒤, 성공 or 에러를 통해 종료된다.
2) Infinite observable sequences
: 무한한 sequence, 무한 하게 관찰 가능한 sequence (보통 UI 이벤트)

✨ Disposable과 DisposableBag

Observable의 subscribe들은 모두 Disposable 를 반환합니다.
subscribe()의 리턴타입인 Disposable에서 disposed(by:)메소드를 호출하면 사용할 수 있습니다!

구독을 dispose하기 위해 사용하거나 실행 취소를 위해 dispose를 사용합니다.

1) Disposables
2) BooleanDisposable
3) CompositeDisposable

Subscription마다 각각 dipose를 관리하는 것은 리스크가 있기에 DiposeBag을 지원합니다!
DisposableBag에 담긴 Disposable은 DisposableBag이 해제되는 시점에 모두 함께 해제되어집니다.

 
profile
👩‍🌾 GitHub: ezidayzi / 📂 Contact: ezidayzi@gmail.com

0개의 댓글