Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

teunteun2

[RxSwift] Observable & Observer & Dispose를 이해해보자 본문

iOS

[RxSwift] Observable & Observer & Dispose를 이해해보자

teunteun2 2022. 4. 8. 23:05

순서

  • RxSwift ? RxCocoa?
  • Observable & Observer & Subscribe
  • Observable
  • Dispose

1. RxCocoa는 뭘까 ?

~ Cocoa Touch Framework에 Rx를 합친 RxSwift 기반의 라이브러리 ~

 

RxSwift와 가장 큰 차이점은

RxSwift기본적인 데이터 비동기 처리가 가능하다면

RxCocoa는 tableView.rx / button.rx / pickerView.rx 와 같이

각 UI요소의 기능 (ex. tap, selected item 처리 등) 의

비동기 처리를 돕는다는 것 !

 

1-1. RxSwift & RxCocoa & 그 외

RxSwift와 RxCocoa 외에도 테이블뷰와 컬렉션뷰

datasource delegate 기능을

좀 더 편리하게 쓸 수 있는 RxDataSources,

 

서버통신 시 많이 쓰이는 alamofire에

Rx를 합친 RxAlamofire 등의 Rx 기반 라이브러리가 몇개 더 있다.

https://github.com/RxSwiftCommunity

 

RxSwift Community

RxSwift ecosystem projects. RxSwift Community has 74 repositories available. Follow their code on GitHub.

github.com

 

2. RxSwift의 Observable & Observer 그리고 Subscribe 이해

 

Observable

비동기 처리가 필요한 요소(데이터 , 이벤트)를

‘관찰 가능한 상태’로 표현한 것이라고 생각합시다. 쉽게 ?

 

Observer

Observable를 Subscribe 한 것을 Observer 라 합니다.

그래서 옵저버를 구독자라고 표현하기도 해요.

Observer는 이벤트가 emit 되면 관찰 중이기 때문에 바로 알 수 있겠죠 ?

 

Subscribe

Observable와 Observer를 연결시켜주는 메서드

이 메서드는 Subscribe 뿐만 아니라 bind, drive 등의

다른 종류의 메서드가 더 있어요.

 

<코드 예시>

let observable = Observable.just([ "영화", "드라마", "애니메이션" ]}

let observer = Observer.subscribe({ event in
		print(event)
})

// event를 출력해보면

/*
	next(1)
	next(2)
	next(3)
	next(4)
	next(5)
	completed
*/

- 정리 -

뷰를 짜다보면 특정 이벤트에 따라 데이터가 변경되거나 ,

뷰 또는 로직 자체가 변경되기도 합니다.

 

여기서 말하는 이벤트!

이 이벤트를 방출(emit)하는 Observable이 있고,

이 이벤트를 캐치해서 처리하는 Observer가 있는 것이죠

 

서로를 연결해주기 위해 Observer가 Observable를 subscribe 하며 ,

Observer & Observable 두 역할을 모두 할 수 있는 Subject가 있습니다.

 

2. Observable

 

2-1. Observable 생성 Operator

Observable.create 메서드보다

좀 더 간편하게 Observable를 생성하기 위한 오퍼레이터들입니다.

Just

하나의 값만 방출하는 Operator

Of

2개 이상의 값을 방출하는 Operator

 

From

배열의 각 요소를 방출할 때 쓰이는 Operator , 배열 각 요소를 Observable로 방출합니다.

CombindLatest

2개 이상의 항목을 연산하거나 결합하여 Observable로 방출합니다.

 

let itemsA = [1.1, 2.2, 3.3, 4.4, 5.5]
let itemsB = [6.6, 7.7, 8.8, 9.9]

// ------ just
Observable.just(itemsA)
	.subscribe { value in
			print(value)
	}
	.disposed(by: disposeBag)

// next([1.1, 2.2, 3.3, 4.4, 5.5])
// completed

// ------ of
Observable.of(itemsA, itemsB)
	.subscribe { value in
			print(value)
	}
	.disposed(by: disposeBag)

// next([1.1, 2.2, 3.3, 4.4, 5.5])
// next([6.6, 7.7, 8.8, 9.9])
// completed

// ------ from
Observable.from(itemsB)
	.subscribe { value in
			print(value)
	}
	.disposed(by: disposeBag)

// next(6.6)
// next(7.7)
// next(8.8)
// next(9.9)
// completed

 

2.2 Observable LifeCycle

  1. create 오퍼레이터를 통해 Observable를 생성
  2. subscribe를 통해 Observable를 실행시킨다 (옵저버와 연결)
  3. next를 통해 이벤트를 방출
  4. 이 과정에서 오류가 발생하면, error를 알리고, 모든 이벤트가 정상적으로 emit되었다면 completed 를 알린다
  5. deinit 되는 시점 - 즉, sequence가 종료되는 시점에 dispose 된다
  6. error , completed를 전달받으면 sequence가 종료되며, 종류 후엔 이벤트가 발생하지 않는다. 즉 Observable 재사용 불가 !

 

3. Dispose

public protocol Disposable {
	func dispose()
}
  • Disposable은 구독중인 stream을 원하는 시기에 처리할 수 있도록 돕습니다.

Observable의 next 이벤트가 error, completed 상태로 넘어가면

disposed로 넘어가 Sequence가 종료되는데요,

 

여기서 만약 next 이벤트가 무한히 방출될 수 있는 상황에선 ?

disposed 될 일이 없겠죠 ?

 

클래스의 메모리가 해제되는 시점에 Disposed 되지만,

RootViewController일 경우 메모리에서 클래스가 해제되지 않아요.

=> 이럴 경우 직접 관리를 해주기 위해

dispose 메서드를 호출해서 정리해줄 수 있어요.

 

이런식으로요

let Observable1 = 어쩌구 저쩌구 선언

Observable1.dispose()

근데 만약 여러 Observable을 구독한다면?

모든 Observable 마다 dispose()를 호출해주는 것은 비효율적일거에요.

 

이 과정을 한 번에 처리해주기 위해

존재하는 것이 바로 DisposeBag() 입니다.

let disposeBag = DisposeBag()

self.disposeBag = DisposeBag()

// disposeBag 인스턴스를 초기화 해주기만 하면 한 번에 정리 가능 !

→ 다음시간 까지 정리할 것

  1. Observable vs Subject vs Relay
  2. Subject 종류와 특징
  3. Subscribe 외의 구독 메서드 종류와 특징