티스토리 뷰

iOS/RxSwift

RxSwift - Observables, Observers

포도 동 2022. 2. 27. 22:19

Observables?

RxSwift 공식 문서에서 Observables aka Sequences라고 소개하고 있습니다.

이 말은 RxSwift에서 Observable은 Sequence, Observable Sequence와 같은 의미로 사용한다는 뜻입니다.

 

"Every Observable sequence is just a sequence. The key advantage for an Observable VS Swift's Sequence is that it can also receive elements asynchronously. This is the kernel of RxSwift, documentation from here is about ways that we expand on that idea."

공식문서에서 Swift의 Sequence와의 차이점으로 Observable은 요소를 비동기적으로도 수신할 수 있다고 설명합니다.

 

우리는 Observable에서 Observer로 이벤트를 전달하고, Observer는 Observable을 감시(Subscribe)하고 있다가 전달받는 이벤트를 처리합니다.

 

Rx에서 Observable (Sequence)는 세 종류의 이벤트를 전달할 수 있습니다.

enum Event<Element>  {
    case next(Element)      // next element of a sequence
    case error(Swift.Error) // sequence failed with error
    case completed          // sequence terminated successfully
}

class Observable<Element> {
    func subscribe(_ observer: Observer<Element>) -> Disposable
}

protocol ObserverType {
    func on(_ event: Event<Element>)
}

1. Next : Observable에서 발생한 새로운 이벤트를 전달. (Emission)

2. Error: Observable에서 에러가 발생했을 때 (Notification)

3. Completed: Observable이 성공적으로 끝났을 때 (Notification)

 

Sequence은 0개 또는 그 이상의 요소를 가질 수 있습니다.

Sequence가 Error 또는 Completed 이벤트를 전달하면 Sequence는 다른 요소를 생성할 수 없고, Sequence 내의 모든 리소스가 해제됩니다.

Sequence 요소의 생성을 취소하고 Sequence 내의 모든 리소스를 즉시 해제하려면 dispose를 호출해 직접 해제시킬 수 있습니다.

 

Observable 만들기

두 개의 문자열 ["apple", "banana"]를 순서대로 방출하는 Observable을 만들어보겠습니다.

첫 번째 방법은 create 함수를 이용하는 것입니다.

// ob1이라는 이름에 Observable을 직접 구현
let ob1 = Observable<String>.create { (observer) -> Disposable in
    observer.onNext("apple")
    observer.onNext("banana")
    
    observer.onCompleted()
    // 두 개의 문자열을 방출하고 완료하는 옵저버
    
    return Disposables.create()
    // disposable은 메모리 정리를 위한 객체
}

두 번째 방법은 연산자를 이용하는 것입니다. 위와 같이 배열을 순서대로 방출하고 완료하는 이벤트에는 from 연산자를 사용할 수 있습니다.

let ob2 = Observable.from(["apple", "banana"])

 

하지만, Observable이 생성되었다는 이유만으론 어떠한 작업도 수행하지 않습니다. Observable이 실행되게 하려면 이를 구독하는 Observer (Subscriber)가 있어야 합니다.

 

Observable 구독(Subscribe)하기 - Observer 생성하기

Observable을 구독하기 위해서 subscribe 메소드를 한 번 살펴봅시다.

Subscribe 메소드는  Observable과 Observer를 연결합니다.

public func subscribe(
        onNext: ((Element) -> Void)? = nil,
        onError: ((Swift.Error) -> Void)? = nil,
        onCompleted: (() -> Void)? = nil,
        onDisposed: (() -> Void)? = nil
    ) -> Disposable

위와 같이 subscribe 함수는 각 각의 이벤트가 클로저로 구현되어 있고, 이는 모두 옵셔널 형태이기 때문에 필요한 이벤트만 작성해 사용할 수 있습니다.

 

각 이벤트는 Observer가 Observable을 subscribe하는 시점에 전달됩니다.

예를 들어 위에서 작성한 Observable을 subscribe해 볼까요? 

ob1.subscribe(onNext: { str in
    print("Next", str)
}, onError: { error in
    print("Error", error)
}, onCompleted: {
    print("completed")
}, onDisposed: {
    print("disposed")
})


// # Result
// Next apple
// Next banana
// completed
// disposed

위와 같이 모든 클로저에 대한 처리를 직접 구현할 수 있습니다.

그리고 아래와 같이 element에 직접 접근하여 값을 활용할 수도 있습니다.

ob1.subscribe({
    if let element = $0.element {
        print(element)
    }    
})
// # Result
// apple
// banana

 

 

참고: https://github.com/ReactiveX/RxSwift/blob/main/Documentation/GettingStarted.md#observables-aka-sequences

'iOS > RxSwift' 카테고리의 다른 글

RxSwift - Relay  (0) 2022.03.05
RxSwift - Subject  (0) 2022.03.04
RxSwift - Disposable, DisposeBag  (0) 2022.03.01
RxSwift - Infallible  (0) 2022.02.28
RxSwift 시작하기  (0) 2022.02.27
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
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
글 보관함