iOS/Swift

[RxSwift] Observable 뿌시기

하노 Hano 2022. 11. 4. 01:40

안녕하세요 하노입니다 :)

갑자기 오늘 날씨가 추워졌네요! 오늘 영하 2도까지 내려가던데 다들 건강 챙기세요~!!!

 

요새 RxSwift를 공부하면서, RxSwift 로고를 맥북에 붙이고 다니면 이쁘겠는데????

생각해서 스티커를 100장이나 뽑아버렸습니다....ㅎㅎ

 

오늘은 RxSwift 3요소 중 Observable에 대해서 알아보려 합니다!

 

그럼 시작하겠습니다!!

 


 

1. Observable이란?

여러 이벤트들을 생성하고 방출(Emit)할 수 있는 대상.

(Observable = Observable Sequence = Sequence 모두 같은 단어이다.)

 

Observable에서 가장 중요한 것은 이벤트를 비동기적으로 생성, 방출할 수 있습니다.

 

 

2. Observable의 생명 주기

Observable은 3개의 구성요소가 있습니다.

 

  • next: 이벤트를 동해 각 요소를 방출.

  • completed: 이벤트가 모두 방출되면 completed 이벤트 발생 후 종료.

 

  • error: 1, 2번 이벤트를 방출 후 에러 발생 시 error 이벤트 발생 후 종료.

 

 

 

 

3. Observable 생성

Observable을 생성하려면 생성 Operator가 필요합니다.

생성 Operator 종류는 많지만 그중에서 가장 대중적으로 쓰이는 3가지만 살펴보겠습니다.

 

1.  just

오직 하나의 요소를 포함하는 Observable 생성.

 

let integer: Int = 1

Observable.just(integer)

 

 

2. of

가변적인 element를 포함하는 Observable 생성.

 

Observable<Int>.of(1, 2, 3, 4, 5)

 

 

 

3. from

array 요소를 포함하는 Observable 생성.

 

let intArray = [1, 2, 3, 4]

Observable.from(intArray)

 

 

이 세가지의 생성 Operator가 어떤 차이가 있는지 알아보겠습니다.

 

let itemA = [1, 2, 3, 4, 5]
        
Observable.just(itemA)
	.subscribe { value in
		print("just - \(value)")
	} onCompleted: {
		print("just - completed")
	} onDisposed: {
		print("just - disposed")
	}
	.disposed(by: disposeBag)
        
Observable.of(itemA)
	.subscribe { value in
		print("of - \(value)")
	} onCompleted: {
		print("of - completed")
	} onDisposed: {
		print("of - disposed")
	}
	.disposed(by: disposeBag)
        
Observable.from(itemA)
	.subscribe { value in
		print("from - \(value)")
	} onCompleted: {
		print("from - completed")
	} onDisposed: {
		print("from - disposed")
	}
	.disposed(by: disposeBag)

 

위와 같은 코드를 실행하면,

 

이렇게 결과가 나옵니다.

 

여기서 just와 of는 배열 형태 그대로 출력되는데 from은 혼자서 배열의 멤버를 차례로 뽑아주네요??

 

여기서 차이가 생깁니다!

 

  • just: 요소를 오직 한 가지만 생성 가능
  • of: 여러개의 요소를 생성 가능
  • from: 오직 한 개의 배열 타입만 생성 가능

로 정리해볼 수 있겠습니다. 위 코드에선 다루지 않았지만 요소를 관점으로 보자면,

 

just, from은 오직 한 개의 요소로만 생성 가능하지만,

of는 여러개의 요소로도 생성이 가능하다.

 

로 정리해볼 수있겠습니다!

 

 

 

 

 

4. Observable Subscribing

흔히 Observable 구독이라고도 말할 수 있는 Subscribing을 해주어야 비로소 이벤트를 방출(Emit)할 수 있습니다.

 

Subscribing은 아래 코드처럼 작성해서 이벤트를 방출시킬 수 있습니다.

 

let label = UILabel()

Observable.of(1, 2, 3)
	.subscribe { value in
    	label.text = "\(value)"
    }

 

위 코드처럼 Subscribe 메서드를 이용하여 이벤트를 방출시킬 수 있습니다.

 

 

 

5. Observable Disposing

만약 Observable에서 이벤트를 모두 방출시켰다면, 이 Observable은 더 이상 메모리를 할당시켜줄 필요가 없겠죠??

그럴 때 쓰는 것이 Disposing 키워드입니다.

 

Disposing은 Subscribing과 반대로 구독을 취소시켜 메모리를 해제해줍니다.

 

그리고! 일일이 개발자가 구독을 취소시킬 필요 없이,

RxSwift에서는 자동으로 구독을 취소시켜주는 메서드가 존재합니다.

 

let label = UILabel()
let disposeBag = DisposeBag()

Observable.of(1, 2, 3)
	.subscribe { value in
    	label.text = "\(value)"
    }
    .disposed(by: disposeBag)

 

 

 

6. Observable & Observer

사실 Observable과 뗄레야 뗄 수 없는 관계인 Observer가 있습니다.

 

만약 Observable이 생성되고, 이벤트를 계속해서 방출하는데,

그 이벤트를 받아서 처리해줄 친구가 없으면 말짱 도루묵이겠죠??

 

그 이벤트를 받아서 처리해줄 친구가 바로 Observer입니다!!

 

let label = UILabel()
let disposeBag = DisposeBag()

Observable.of(1, 2, 3)			// Observable 생성
	.subscribe { value in		// Observable 구독 및 이벤트 방출
    	label.text = "\(value)"		// Observer가 이벤트를 받음.
    }
    .disposed(by: disposeBag)		// Observable 구독 취소 (메모리 해제)

 

 

위 코드를 예시로 어떻게 동작하는지 순서대로 살펴보겠습니다.

 

  1. 생성 Operator (.of())를 통해 Observable을 생성한다.
  2. .subscribe를 통해 Observable을 이벤트를 방출(emit)한다.
  3. Observer(위 코드에선 label)가 이벤트를 받는다.
  4. 이벤트가 모두 끝나면 구독을 취소시킨다.

입니다!

 

어느정도 이해가 되셨나요???

 

 

그런데 사실, 앞서 봐왔던 코드처럼 단순한 코드들은 에러가 날 상황이 보이지 않는데,

만약 네트워크 통신처럼 에러가 날 경우가 다반사일 경우는 어떻게 하죠????

 

사실 .subscribe와 .disposed(by:) 사이에는 숨겨져 있는 게 있습니다.

 

그것이 뭐죠??????

 

 

7. Observable Error & Complete

 

앞서 말씀드린 것처럼 .subscribe와 .disposed(by:) 사이엔 error와 complete 이벤트가 숨겨져 있었습니다.

 

complete는 1번에서 보셨죠???? 마찬가지로 error 또한 핸들링이 가능합니다.

 

아래의 코드를 보면서 이해해보겠습니다.

 

let label = UILabel()
let disposeBag = DisposeBag()

Observable.of(1, 2, 3)			// Observable 생성
	.subscribe { value in		// Observable 구독 및 이벤트 방출
    	label.text = "\(value)"		// Observer가 이벤트를 받음.
    } onError: { error in
    	//error
    } onCompleted: {
    	//completed
    }
    .disposed(by: disposeBag)		// Observable 구독 취소 (메모리 해제)

 

위 코드처럼 error, complete 이벤트가 발생했을 때 핸들링을 하기 위한 코드가 .subscribe에 포함되어 있습니다!!

 

 

 

 


 

오늘은 RxSwift Observable을 다뤄보았습니다.

 

저도 헷갈리는 부분들을 글로 정리하면서 제 머릿속도 정리된 느낌이네요!

 

더 헷갈리는 부분이 뒤에 엄청 많이 있지만,,, 그건 다음 글을 통해 계속 정리해보겠습니다!

(아직까진 할만해....!!)

 

그리고! 혹시나 틀린 부분이나 애매한 부분이 있다면 언제든지 댓글로 남겨주시면 감사드리겠습니다!

 

 

그럼 오늘 글은 여기서 마치겠습니다. 감사합니다 :D