티스토리 뷰

728x90
반응형

해당 포스트는 곰튀김님의 강의영상을 개인적으로 공부한 내용을 정리한 글입니다.

자세한 내용은 영상을 직접 보시는것을 추천드립니다..!

 

 

 


1. Operator란?

 

 

RxSwift의 용도를 다시 정리해보면, 

비동기적으로 생기는 데이터리턴값으로 전달하기 위해 Observable이라는 클래스로 감싸서 전달하기 위함

으로 정리할 수 있습니다.

이처럼 Observable.create를 해주고, 해당 Observable을 subject해 주면 사용이 가능하다.

위의 사진 2장은 이러한 RxSwift를 사용한 가장 기초적인 코드 입니다.

그런데 onError() / onNext() / onCompleted() 부터 시작해서 ~ .next() / .error() / .completed() 까지,,,,

 

기본적인 코드조차도 너무 써야하는 것들이 많고 복잡해 보입니다.

 

그래서, Rx에는 이런 귀찮은 코드들을 간편하게 줄여주는 문법들이 존재합니다!!

또한 이런 편리한 기능을 제공해주는 문법들을 RxSwift에서는 Operator라고 부릅니다!

just라는 operator를 사용하여 5줄의 코드를 단 1줄로 고친 모습....

이렇게 Observable.just를 사용하면, 5줄의 코드를 단 1줄로 작성이 가능합니다!

 

또한, Array내부에 있는 element들을 받아오고 싶다고 하면 Observable.from을 사용하면 됩니다.

Observable.from을 사용하면, Array에 있는 요소를 하나씩 가져올 수 있다.

위의 just / from은 1) 데이터를 Observable로 가공하는 시점에서 사용하는 Operator들이고,

2) 생성된 Observable을 방출하기 전 새로운 값으로 변환 하거나 (ex. filter / map .....)

3) Observable이 방출되는 과정에 영향을 주는 기능(ex. observeOn / subscribeOn .....)을 하기도 합니다.

 

 

 .observeOn / .map / .filter

위 사진의 map / filter / observeOn 모두 operator의 일종이다.

이처럼, Operator의 종류는 생각보다 상~~~~당히 많습니다.

그렇기 때문에,

우리는 이 모든 Operator를 다 외우는 것이 아니라 어떻게 찾아보고 사용법을 알아내는지를 공부해야 합니다!

 

이것을 위해서는, 공식문서인 ReactiveX에 들어가서 각 Operator 항목들을 읽어봐야합니다.

 

 


 

ReactiveX를 통해 Operator 알아보기

 

Operator의 한 종류인 'ObserveOn()'의 마블그림

Operator를 찾아서 들어가보면 이러한 '마블그림'이 나와있는데,

이러한 마블그림을 보는 법만 익숙해진다면, 모든 operator들을 이해할 수 있을것입니다!

 

몇 개의 Operator들의 마블그림을 예시로 살펴보도록 하겠습니다.

 

1) .Just

데이터가 Just를 통해 Observable 하나를 방출하면서, Complete해준다.

위 사진처럼, .Just는 [하나의 데이터를 입력하면 Just라는 연산자를 통해 1개의 Observable을 방출하면서 Complete 해줍니다.]

 

2) .From

Array데이터를 입력하면, from을 통해 각 element들을 Observable로 방출하면서 Complete 해준다.

 

.from은 [1개의 Array를 입력하면 from 연산자를 통해 Array의 element들을 Observable로 방출하면서 Complete 해줍니다.]

 

 

3) .map

Observable데이터를, map내부에 작성한 공식에 따라 값을 변환하여 다시 Observable로 방출한다.

.map은 just / from과는 다르게 Observable로 들어온 값map내부의 식에 따른 값으로 변환하여 다시 Observable로 방출합니다!

 

 

4) .filter

Observable데이터를, filter내부 조건에 따라 해당 조건에 해당하는 Observable만 재방출 한다,

.filter 또한 Observable로 들어오는 데이터를 다룰 때 사용하는데, filter내부 조건에 해당하는 Observable을 재방출 해줍니다.

 

 

 

5) .observeOn

 

.observeOn는 쉽게 말 하자면, 쓰레드를 교체할 때 사용합니다.

이미지에서 볼 수 있듯이, ObserveOn을 통해 방출되는 Observable들을 새로운 쓰레드에서 동작하게 해준다.
subscribeOn을 중간에 호출 하더라도, 무조건 제일 초기 Observable방출 쓰레드를 변경한다.

+ .subscribeOn

observeOn은 어디서 사용하든 쓰레드를 변경할 수 있지만
subscribeOn은 제일 처음 Observable을 방출하는 쓰레드 변경에만 영향을 줍니다.
즉, 중간에 subscribeOn을 호출 하더라도 중간 쓰레드가 변경되는 것이 아니라 초기 실행 쓰레드를 변경하게 되는 것입니다.

 

순서는 observeOn -> subscribeOn이지만 / 실제 동작 순서는 subscribeOn -> observeOn 순서이다.

위와 같이, 순서를 observeOn -> subscribeOn으로 하더라도 subscribeOn에 의해 처음 시작 쓰레드를 ConcurrentDispatchQueue로 변경하고 이후에 observeOn에 의해서 Main Thread로 변경하게 됩니다.

 

 

 

 

RxSwift에서 데이터의 흐름을 나타내는 용어Stream이라는 용어를 사용합니다.

이러한 Stream은 나중에 할 일이든, 지금 할 일이든 비동기적으로 작업을 수행하기 위해 미리 만들어 놓는 통로 입니다.

(Observable == Stream 입니다.)

또한, RxSwfit에서는 이러한 Stream을 다루는 Operator들도 제공합니다.

Combining Observables : stream의 분리 / 병합을 도와주는 Operator들 이다.

이처럼 다양한 Operator들이 제공되는데, 그 중에서 빨간 네모로 지정한 CombineLatest / Merge / Zip을 가장 많이 사용합니다.

 

 

 

1. Merge

여러개의 Observable 스트림을 합쳐서 1개의 Observable 스트림으로 방출해준다.

위에있는  Merge의 마블그림을 보면 알 수 있지만,

단순하게 여러개의 Observable을 합쳐서 1개의 Observable으로 방출해줍니다.

그렇기 때문에, Merge에 넣는 Observable들은 반드시 서로 같은 타입이어야 한다!

 

 

 

2. Zip

반드시 1쌍이 되는 Observable에 대해서만, 1개의 Observable로 병합하여 방출해준다.

여러 Observable에서 1:1로 대응되는 데이터가 있을 때, 하나의 Observable로 병합하여 값을 방출합니다.

따라서, 만약 마지막에 쌍이 존재하지 않는 데이터가 발생하면 이 데이터의 경우는 무시됩니다.

또한, 쌍으로 맺어지는 Observable의 데이터 타입은 서로 달라도 상관이 없습니다.

 

 

 

3. CombineLatest

Zip과는 다르게 무조건 1:1로 대응되는 쌍이 아니라, 가장 최근 방출된 Observable끼리 쌍을 맺는다. (즉, 중복 가능)

Zip은 여러 Observable에서 반드시 1:1로 대응되는 데이터만 Combine하여 새로운 Observable로 방출이 되는데, 

CombineLatest의 경우에는, 가장 최근에 방출된 데이터끼리 쌍을 맺고 새로운 Observable로 방출합니다.

 

 

 

+ Combine Operator 작성 예시

Zip을 사용하여 Observable로 방출되는 "Hello World" 와 json을 결합하여 새로운 Observable 스트림으로 방출하고 있다.

 

728x90
반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday