Hello RxSwift
RxSwift란?
ReactiveX 라이브러리를 Swift 언어로 구현한 것이다.
그렇다면 ReactiveX는 무엇일까?
공식 홈페이지에 들어가보면 다음과 같이 적혀있다.
An API for asynchronous programming with observable streams
여기서 주목해야 할 키워드는 asynchronous
와 observable
이다.
비동기적으로 발생한 이벤트를 관찰 가능하게 만들어 반응형 프로그래밍을 할 수 있도록 한다. 정확한 정의는 아니지만 지금 당장은 이정도로 생각해 볼 수 있다.
더 자세한 내용은 추후에 포스팅 할 계획이다.
왜 RxSwift?
그렇다면 장점은 무엇일까?
RxSwift의 장점은 단순하고 직관적인 코드를 작성할 수 있다는 것이다.
tableView
와 collectionView
를 구현할 때 전통적인 델리게이트 패턴을 이용하지 않고 단순한 코드로 구현할 수 있다.
viewModel
.rows
.bind(to: resultsTableView.rx.items(cellIdentifier: "WikipediaSearchCell",
cellType: WikipediaSearchCell.self)) { (_, viewModel, cell) in
cell.title = viewModel.title
cell.url = viewModel.url
}
.disposed(by: disposeBag)
KVO
와 Notification
역시 이전보다 더 단순한 코드로 구현할 수 있다. RxSwift github - Why를 보면 더 자세한 내용을 알 수 있다.
Observable
이벤트를 방출(emitting)하는 대상
Observable
은 이벤트를 전달한다. Observer
는 Observable
을 감시하고 있다가 전달되는 이벤트를 처리한다. Observable
을 감시하는 것을 subscribe한다고 하여 Subscriber
라고도 한다.
Observable이 방출하는 세 가지 이벤트
Next
Observable에서 발생한 새로운 이벤트는 Next 이벤트를 통해 전달된다.
이벤트에 값이 포함되어있으며, 이 과정을 Emission
이라 한다.
Error / Completed
Observable에서 에러가 발생하면 Error 이벤트가 전달되고, Observable이 정상적으로 종료되면 Completed 이벤트가 전달된다.
두 이벤트는 Observable의 라이프 사이클에서 가장 마지막에 전달되는 이벤트이다. 이후 Observable이 종료되고 모든 resource가 정리되기 때문에 다른 이벤트가 전달되지 않는다.
보통 이 과정을 Notification
이라 한다.
Marble Diagram
Observable과 연산자의 흐름을 시각적으로 표현
화살표는 상대적인 시간의 흐름이고 원은 이벤트, 더 정확히 Next Event
를 말한다. 원 내부에 표시된 숫자는 이벤트에 저장된 값을 의미한다. 화살표 오른쪽에 있는 vertical bar는 완료, 즉 Completed Event
이며, Observable
의 life-cycle은 이곳에서 종료된다.
Error Event
는 엑스로 표시하며, completed event와 마찬가지로 라이프사이클이 종료된다.
RxSwift Community - RxMarbles에서 프로젝트를 클론하여 앱을 설치하면 직접 이벤트를 이동시키면서 결과를 확인할 수 있다.
RxJS Marbles를 보면 js로 되어있지만 동일한 개념을 공유하므로 참고하면 좋다.
Observable 동작 직접 구현
두 개의 정수를 방출하고 종료하는 Observable을 두 가지 방법으로 구현해보자.
create 연산자
Observable<Int>.create { (observer) -> Disposable in
observer.on(.next(0))
observer.onNext(1) // on+next method를 더 간편하게 사용 가능
observer.onCompleted()
return Disposables.create()
}
from 연산자
Observable.from([0, 1])
위 코드는 Observable을 생성하고 이벤트가 어떤 순서로 전달되어야 하는지 정의한다. 아래 코드만으로는 정수가 방출되거나 이벤트가 발생하지 않는다. 이벤트가 발생하기 위해서는 Observer
가 Observable
을 구독해야 한다.
참고
'iOS > 학습정리' 카테고리의 다른 글
iOS) RxSwift 가볍게 훑어보기 (3) just, of, from (0) | 2021.01.30 |
---|---|
iOS) RxSwift 가볍게 훑어보기 (2) PublishSubject (0) | 2021.01.30 |
CS) 프로세스와 스레드 (0) | 2021.01.22 |
iOS) 오토 레이아웃과 오토 리사이징 (0) | 2021.01.15 |
iOS) Core Data - 다른 저장소와의 비교 (0) | 2021.01.12 |