본문 바로가기
iOS/개념

[곰튀김 RxSwift + MVVM 시즌2 - 2교시] RxSwift 활용하기 - 쓰레드의 활용과 메모리 관리

by 나리._. 2021. 12. 29.

https://github.com/iamchiwon/RxSwift_In_4_Hours

 

GitHub - iamchiwon/RxSwift_In_4_Hours: RxSwift, 4시간 안에 빠르게 익혀 실무에 사용하기

RxSwift, 4시간 안에 빠르게 익혀 실무에 사용하기. Contribute to iamchiwon/RxSwift_In_4_Hours development by creating an account on GitHub.

github.com

해당 포스팅은 위의 곰튀김님 시즌2 RxSwift + MVVM 강의와 코드를 복습할겸 정리해본 (개인 공부를 위한) 포스팅입니다.

강의에서는 해당 목차와 달리, 순서없이 진행되었지만 튀김님이 정리해놓은 목차에 따라 정리해볼 것이다!

[2교시] RxSwift 활용하기 - 쓰레드의 활용과 메모리 관리

  1. Observable Life-Cycle
    • Subscribed
    • Next
    • Completed / Error
    • Disposabled
  2. 순환참조와 메모리 관리
  3. 쓰레드 분기
    • DispatchQueue, OperationQueue
    • observeOn, subscribeOn
  4. Stream의 분리 및 병합
    • combineLatest, merge, zip

 

1. Observable Life-Cycle

이건 1교시 부분에서 정리했으니까 pass -> 아래 포스팅에 있습니당

https://yesiamnahee.tistory.com/166

 

2. 순환참조와 메모리 관리

여기서 순환 참조는?

두 개의 인스턴스들이 강한참조로 서로를 가르키고 있어  메모리에서 정상적으로 해제되지 않는 현상을 말한다.

(= Strong Reference Cycle 강한참조 사이클)

 

순환참조 관련 포스팅은 아래를 참조해주세용!

https://yesiamnahee.tistory.com/169?category=896942 

 

메모리 누수가 발생하는 상황 : 강한 참조 사이클 + 해결방안?

이 포스팅을 보기전 RC가 무엇인지 모른다면 아래 포스팅을 먼저 보시면 도움이 되실거 같슴다 ^.^ https://yesiamnahee.tistory.com/168 힙 메모리 관리 - ARC 정리 힙 메모리를 왜 관리해야할까? 스위프트에

yesiamnahee.tistory.com

 

아래 코드를 보면 Observable을 Subscribe 할때 클로저 안에서 외부변수를 캡처하여 (RC +1 ) 가지고 있기 때문에 순환참조가 생기는 것을 확인할 수 있다.

 

그럼 순환 참조가 발생하지 않기 위해서는 어떻게 해야할까?

 

일단 이전에 공부했던 방식(위의 포스팅에서 정리했던)으로는

우리는 아래와 같이 [weak self]를 이용하여 순환참조를 해결할 수 있다 !

 

이 방식이 아닌 다른 방식을 알아보자.

 

이 클로저가 종료되면 자동으로 외부변수의 RC가 -1씩 감소될것이고 순환참조가 생기지 않을 것이다.

 

그럼 이 클로저는 언제 없어질까?!

Observable이 completed, error등에 Dispose 되면 이 클로저는 없어진다.

 

그래서 우리는 downLoadJson()에서 아래 코드와 같이 onCompeleted() 한줄을 추가해주면!

클로저가 스스로 사라지고 순환참조 문제까지 해결될 것이다.

 

3. 쓰레드 분기

DispatchQueue.global().async 

DispatchQueue.main.async

를 사용하여 우리는 쓰레드를 설정했다.

 

하지만 Rx에서 제공하는 Sugar API를 이용하면 우리는 쓰레드를 더 쉽게 설정할 수 있다.

 

* Observable 의 스케줄러를 설정 - observe(on:)

 

observe(on:"쓰레드")은 위에서 전달되는 Observable의 쓰레드를 이후 Observable부터 여기서 지정한 "쓰레드"로 변경해주는 operator이다.

위의 마블 다이어그램을 보면 observe(on:주황색) 이후에는 다 주황색 쓰레드로 변하는 것을 볼 수 있다. 

즉, DownStream의 쓰레드를 변경해주는 Operator

 

 

* Subscribe 의 스케줄러를 설정 - subscribe(on:)

 

subscribe(on: "쓰레드") 은  Subcribe 시점의 처음 Observable이 실행될 쓰레드를 여기서 지정한 "쓰레드"로 변경해주는 operator이다.

위의 마블 다이어그램을 보면 subscribe(on: "파랑색")하면 맨 위의 Observable이 파랑색 쓰레드로 변하는 것을 확인할 수 있다.

observe(on:) 과는 달리 subscribe(on:)은 처음 실행되는 Observable의 쓰레드를 변경 시킨다.

즉, UpStream의 쓰레드를 변경해주는 Operator

 

4. Stream의 분리 및 병합

  • combineLatest, merge, zip

해당 operator들은 이전 포스팅들에서 정리했기 때문에 combine, merge, zip 셋의 차이점만 정리해볼 것이다.

 

merge는 여러개의 Observable을 묶어서 하나로 만들어주는 operator이다.

merge의 특징은 Observable들이 전달하는 데이터 타입이 같아야한다는 것이다.

 

zip은 여러개의 Observable이 전달해주는 데이터를 쌍으로 묶어서 전달해주는 operator이다.

zip의 특징은 쌍이 없으면 전달해주지 않고 Observable들의 데이터 타입이 달라도 상관이 없다.

 

combineLatest는 zip과 비슷하지만 zip은 하나의 Observable에 새로운 데이터가 생겨도 다른 Observable에 쌍을 이룰 새로운 데이터가 나오지 않는다면 새로운 데이터를 전달하지 않지만!

combineLatest는 기존의 가장 최신의 데이터와 쌍을 이루어서 전달해주는 operator이다.

combineLatest 또한 Observable들의 데이터 타입이 달라도 상관이 없다.