# Untitled

RXSwift 기본

- RX의 기본 컨셉은 우리가 작성한 코드가 앱 안에서 기본적으로 라인바이라인으로 동작하는 것이 아니다에 있다.

> ReactiveX, many instructions may execute in parallel and their results are later captured, in arbitrary order, by “observers.”

- RX의 컨셉에 따라, 앱 전반적인 동작 상태에서 아래의 과정이 병렬적으로( ~= 비동기적으로) 진행되고, Observer에 의해 연산된 결과가 뷰에 전달된다.

    - Observable에 맡겨둔 이벤트가 감지되면

    - Observer에 등록해둔 연산(어떤 로직)이 Stream에 따라 동작하여

    - 결과를 전달한다.

- Observable과 Observer의 관계는 기본적으로 subscribe라고 하는 구독 여부에 의해 형성된다.

    - Observable에 연결된 Observer가 없다면, 이벤트 감지에 따른 어떤 스트림도 발생하지 않기에 Observer 구독이 시작된 시점부터 이벤트에 대한 적절한 처리가 진행될 것이다.

    - 물론 구독 관계가 형성되어 있다가 관계를 끊는 unsubscribe 과정도 진행할 수 있다.

- 구독 관계는 Observable의 메서드를 통해 형성된다.

    - onNext: 이벤트를 단계적으로 인식시킨다. emit(배출)된 이벤트마다 해당 메서드가 동작된다.

    - onCompleted: 이벤트에 대한 처리를 성공적으로 처리한 상태에 호출된다. 모든 onNext 처리가 된 다음 마지막으로 실행된다.

    - onError: onNext로 인지된 이벤트 처리 도중에 에러가 발생할 경우 호출된다. 에러가 탐지된 경우, onCompleted도 동작하지 않는다.

    - onCompleted, onError는 당연하겠지만 동시에 호출될 수 없다. 이벤트 구독에 따른 스트림 처리 결과는 성공 / 실패 뿐인 것이다.

    - Observable이 deinit 되는 시점, 스트림이 종료되는 시점에 Dispose된다.

        - 물론, UI단에서 버튼의 터치가 종료되는(?) 상황은 없기 때문에 dispose가 되지 않는 이런 경우도 있다.

- 기본적으로 RX를 Swift에 다룬다고 할 때 신경써야 할 것은,

1. Observable에 어떤 이벤트를 각인시키고,

2. 이벤트를 처리하여 결과를 보여줄 Observer 대상은 누구인지를 잘 결정하는 것이다.

3. Observable의 구독은 결국 Disposable(= 구독을 중지할 수 있는 가능성을 가진 프로토콜)을 반환하기 때문에, 더 이상 구독이 필요없는 이벤트를 위해 메모리를 힘들게 할 필요는 없다. 적절한 구독 해지를 도와줄 disposeBag을 잘 활용하자.

```javascript
func fieldHandler() {
    textField.rx.value   // textField라는 Observable에 value 이벤트를 주고
        .bind(to: label.rx.text) // textField의 텍스트를 보여줄 Observer를 지정해서 바인딩
        .disposed(by: disposebag)
}
```

![Image](https://upload.cafenono.com/image/slashpagePost/20240807/190841_YpN7bGLOai8LgyrWRq?q=80&s=1280x180&t=outside&f=webp)

For the site tree, see the [root Markdown](https://slashpage.com/hankyeol.md).
