IOS October 11, 2018

[RxSwift] 1일차, RxSwift란, Observable에 대한 이해

Words count 4.1k Reading time 4 mins. Read count 0

RxSwift

정의 : Observable Sequense와 함수형 operator를 이용한 이벤트 기반의 비동기 프로그래밍 라이브러리.

참고) iOS SDK에서 지원하는 비동기 프로그래밍

  1. NotificationCenter
  2. Delegate Pattern
  3. GCD (Grand Central Dispatch)
  4. Closure

Rx를 시작하기 전에 해야 할 용어정리

Observable

DataType에 대한 변하지 않는 상태값의 이벤트를 만들어 전달 할 수 있는 능력(프로토콜)

실제 RxSwift 라이브러리 코드를 뜯어보면,

ObservableConvertibleType (최상위 프로토콜)
ObservableType
Observable (하위 프로토콜의 최종 구현체) 로 구성되며

데이터타입이 Observable할 수 있도록 프로토콜을 통해 구현하게 한다.

Observable의 LifeCycle을 살펴보면

  1. next 이벤트를 던진다, terminated 되기 전까지.
  2. completed or Error를 던지면 terminated된다.
  3. terminated 되면 더이상 이벤트를 던지지 않는다.

여기에서 Event란, 인스턴스가 변화하는 상태값을 의미한다. 각각의 상태값은 Observable 이벤트가 흘러가는 동안 immutable 속성을 갖는다.

이벤트의 흐름을 Observable Sequense라고 하며, 보통 Marvel diagram으로 시각화한다.

Operator

Swift에서 기본적으로 제공하는 Array의 filter, map, reduce와 같은 맥락의 커스텀 메소드라고 생각하면 된다.
Observable도 결국 Event 흐름 Array로 각 로직에 맞는 커스텀 Operator를 작성해야 한다.
각각의 Operator는 Input, Output이 명확하게 설계하여 사이드이펙트를 줄이고 단위테스트를 용이하게 할 수 있다.

Scheduler

RxSwift라이브러리에서 Dispatch Queue의 역할을 하는 개념.
결국 Observable을 통해 이벤트를 수신할 수 있도록 하는 스타터.

Scheduler는 커스텀 없이 RxSwift에서 제공하는 기능만으로도 99%를 커버할 수 있다고 한다.

RxSwift 실습

  • 실습에 필요한 환경 : XCode, CocoaPod
  1. Swift Project를 생성 후 pod init을 통해 Podfile생성
  2. Podfile에 pod ‘RxSwift’ 추가 후 pod install
  3. xcworkspace 실행. 빌드.
  4. 프로젝트 내에 playground 파일 생성 후 RxSwift import

예제

1.

let observable = Observable<Int>.range(start: 1, count: 10)

observable.subscribe(onNext: { (event) in
    print(event)
}, onError: { (error) in
    print(error)
}, onCompleted: {
    print("completed")
}) {

}

----

1
2
3
4
5
6
7
8
9
10
completed

range 메소드는 start, count 내의 Event Sequence를 만든다

  1. `swift
    let observable = Observable.of(1,2,3,4,5,6,7)

observable.subscribe(onNext: { (event) in
print(event)
}, onError: { (error) in
print(error)
}, onCompleted: {
print(“completed”)
}) {

}


1
2
3
4
5
6
7
completed


of 메소드에 sequence를 넘기면 순서대로 Event Sequence가 생성된다.

3.

```swift
let observable = Observable.of(["A", "B", "C"])

observable.subscribe(onNext: { (event) in
    print(event)
}, onError: { (error) in
    print(error)
}, onCompleted: {
    print("completed")
}) {

}

----

["A", "B", "C"]
completed

of 메소드에 배열을 넘길 경우 배열 그 자체에 대한 Event가 생성된다.

4.

let observable = Observable.from(["A", "B", "C"])

observable.subscribe(onNext: { (event) in
    print(event)
}, onError: { (error) in
    print(error)
}, onCompleted: {
    print("completed")
}) {

}

----

A
B
C
completed

from 메소드를 사용하면 배열 객체의 각 element에 대한 event sequence가 생성된다.

실제 프로젝트 개발에서의 적용

위의 예제는 정적인 배열 또는 클래스에 대한 Event 생성으로, 학습용일뿐 실제 프로젝트에는 적용할 수 없다.
실제 프로젝트에 적용하기 위해서는 Runtime에 외부 요건(네트워크 통신, 사용자의 입력)에 대한 Event Sequence를 사용해야한다.

Rx에 대한 이해를 바탕을 Observable한 사용자 클래스, 적절한 Operator를 이용해 적용한다.

0%