SeSAC iOS 데뷔과정 2기

1024 새싹 76회차 정리 - RxCocoa 맛보기

Lia's iOS 2022. 10. 25. 00:02
iOS 앱 개발자 데뷔 과정 76회차

 

 

 

#0. RxSwift

Github : https://github.com/ReactiveX/RxSwift

Documentation 번역 : https://github.com/fimuxd/RxSwift

 

 


 

 

#1. Checklist

- Sequence Protocol

https://developer.apple.com/documentation/swift/sequence

Array, Dictionary, Set과 같은 Collection 타입의 기반이 되는 프로토콜이며, Sequence 프로토콜에 부합하는 타입은 for...in 순환문으로 반복 순회가 가능하다.

 


- Iterator Protocol

https://developer.apple.com/documentation/swift/iteratorprotocol

Sequence의 Element를 하나씩 제공해주는 타입으로, Sequence는 Iterator를 생성해서 Element에 접근할 수 있다.

Iterator는 반복 프로세스를 추적하고 Sequence의 Element를 하나씩 리턴해주는 역할을 한다.

 


 

- Observable

- Finite Observable Sequence

파일을 다운로드하는 코드처럼, 강제적이거나 자연적인 종료가 존재하는 시퀀스를 의미한다.

네트워크 통신이 성공적으로 완료되거나 연결 시간이 초과되어 에러가 발생하는 등의 끝이 존재한다.

 

 

- Infinite Observable Sequence

앱의 기기 방향 변경에 반응하는 코드처럼, 발생하지 않을 수도 있지만 무한히 발생할 수 있는 무한한 시퀀스를 의미한다.

UI 이벤트는 Infinite Observable Sequence 인 경우가 많다.

 

 

- Observable LifeCycle

1. Create 연산자를 통해 Observable을 생성한다. (보통 구현되어 있는 Operator를 사용)

2. Subscribe가 되면 Observable이 실행된다.

3. next를 통해 이벤트 (제스쳐, 인스턴스 등) 을 Emit 한다.

 

Lifecycle 중 오류가 발생한다면 error 이벤트를, 정상적으로 모든 이벤트가 완료된다면 completed를 Notification 한다.

deinit 되는 시점, Sequence가 종료되는 시점에 Dispose가 된다.

error 또는 completed를 전달받으면 Sequence가 종료되고, 종료된 이후에는 더이상 이벤트가 발생하지 않는다.

즉, Observable에 대한 재사용이 불가하다.

 


 

- DisposeBag (Disposable)

Disposable은 Subscribe 중인 Stream을 원하는 시기에 처리할 수 있도록 도와준다.

Observable은 모두 Disposable을 Return하며, 이를 통해 Stream을 종료하고 실행되던 Sequence를 모두 종료한다.

Observable의 next 이벤트에 대한 emit이 끝나면, completed ➡️ disposed로 Sequence가 정상적으로 종료된다.

 

하지만 next 이벤트가 무한히 emit 될 수 있는 상황 (Infinite Observable Sequence) 에서는 dispose 되지 않는다.

이 경우 클래스의 메모리가 해제되는 시점에 (deinit) Disposed 되지만 RootViewController 일 경우에는 메모리에서 클래스가 해제되지 않기 때문에, 끝까지 이벤트를 진행하고 Disposed 되거나 Disposed가 되지 않을 수도 있다.

 

이럴 경우 직접 관리를 해주어야 하며, 원하는 시점에 dispose() 메서드를 호출해서 메서드를 정리해줄 수 있다.

하지만 여러 개를 구독하고 있다면, 일일이 모든 구독을 종료하는 것은 힘들기 때문에 DisposeBag의 인스턴스를 초기화하는 과정을 통해 한번에 리소스를 정리할 수 있다.

 


 

- Observer

- Subscribe

대상을 구독함으로써 대상의 상태를 관찰하고, 상태의 변화에 따른 값의 처리를 할 수 있다.

에러 처리와 스레드 지정이 가능하기 때문에 다양한 상황에서 사용한다.

 

- bind

에러 처리가 불가하며, 사실상 onNext만 구현한 subscribe와 같다.

주로 에러가 없는 button.rx.tap 같은 UX subscribe 용으로 많이 사용한다.

 

- drive

에러 처리가 불가하며 (onErrorJustReturn 정도), 무조건 메인 스레드에서 동작한다.

메인스레드에서 실행된다는 보장이 있으므로, 주로 백그라운드 작업 후 UI에 반영되어야 하는 subscribe onNext에서 UI 접근할 때 사용한다.

 


 

- Event

- Next : next stream을 통해 연속된 값들을 방출하고, 옵저버는 이를 관찰 및 구독해서 코드 실행

- Completed : Observable의 next가 모든 값을 다 방출할 경우 complete 되며, 해당 Observable의 stream 종료

- Error : 값을 방출하다가 에러가 발생하면 error를 방출하고, 해당 Observable의 stream 종료

 


 

- Operator

 

 

- just

ObservableType Protocol의 Type Method로 선언되어 있다.

element Parameter로 하나의 값을 받아 Observable을 Return한다.

즉, 하나의 값만 Emit 한다.

 

 

- of

just와 마찬가지로, ObservableType Protocol의 Type Method로 선언되어 있다.

element Parameters가 가변 파라미터로 선언되어 있어 여러 값을 동시에 전달할 수 있다.

즉, 2개 이상의 값을 Emit 할 수 있다.

 

 

- from

배열의 각 요소를 Emit 하고 싶다면 from을 사용한다.

array Parameters로 배열을 받고, 배열의 각 element를 Observable로 리턴한다.

 

 

- combinelatest

2개 이상의 항목을 결합하여 Observable로 Emit 한다.

하나의 항목에만 변화가 발생하더라도, 이벤트를 발생시킨다.

 

 


 

 

# 그 외

 

- 데이터의 흐름 : Stream

아래의 코드는 같은 코드이며, 흐름 이해를 위해 각각 어떤 역할을 하는지 알아보기 위해 분리해서 작성했다.

 

 


 

- RxExample

Example Code로 간단한 기능을 구현하고, 어떻게 동작하는지 이해할 수 있다.

 


 

- setTableView in Rx

 


 

- setPickerView in Rx

 


 

- setSwitch in Rx