[RxSwift] Operators - Create
👨🏻‍💻iOS 공부/RxSwift

[RxSwift] Operators - Create

728x90
반응형

RxSwift의 Operator들 중에서 observable을 생성하는 역할을 하는 operator를 알아볼 것이다!

 

Create

1. 정의

직접 observable sequence를 생성하는 역할을 한다. 

 

Create

 

2. 구현

먼저 create의 구현부를 살펴보자. 

extension ObservableType {
    public static func create(_ subscribe: @escaping (AnyObserver<Element>) -> Disposable) -> Observable<Element> {
        AnonymousObservable(subscribe)
    }
}

우선 파라미터를 보면, "AnyObserver<Element> -> Disposable"타입의 클로저를 넘겨주어야 정상적으로 옵져버블을 생성할 수 있는 것을 볼 수 있다. 이 클로저는 옵저버들에게 어떤 이벤트들이 발생하는지 알려주는 것이다.

 

AnyObserver<Element> 

  • 옵져버블 시퀀스를 구독(subscribe)하게 될 observer를 의미한다. 
Observable.create { <#AnyObserver<_>#> in
    <#code#>
}

실제로 create 연산자를 사용하려고 하면 in 앞에 observer가 들어가게 되고, 이 observer를 가지고 onNext, onError, onCompleted 등으로 이벤트를 넘겨준다. 

 

Disposable

  • 처리(취소)할 수 있는 자원을 나타낸다. 이후에 disposed(by: )를 통해 DisposeBag에 담길 수 있는 타입이다.

3. 사용 예시

Observable<Int>.create { observer in
    // 이벤트 내보내기
    observer.onNext(1)
    observer.onNext(2)    
    observer.onCompleted()
    observer.onNext(3)

    return Disposables.create() // dispose시 아무런 처리할 동작이 필요없는 경우 (= 빈 disposable)
}.subscribe(
    onNext: { print($0) },
    onError: { print($0) },
    onCompleted: { print("completed") },
    onDisposed: { print("Disposed") }
)
.disposed(by: disposeBag) // var = disposeBag = DisposeBag()

이전글에서 봤던 것 처럼 onNext를 통해 값을 emit할 수 있는 것 이다.

 

정상적으로 실행을 마칠 경우 출력값은 다음과 같다. 

1
2
completed
Disposed

3이 출력되지 않은 이유는, 그 이전에 completed 되었기 때문이다. 

 

만약 중간에 에러가 발생했다면 어떤 출력을 내보낼까?

1
anError
Disposed

completed와 error인지 상관없이 Disposed는 출력이 되는 것을 볼 수 있다. 이는 유한한 옵저버블이기 때문에, 완료나 에러가 발생하게 되면 작업을 완료한 것이라고 보고 제일 마지막에 옵저버블 스트림을 종료하며 출력되는 것이다!

 

하지만 만약 onCompleted나 onError를 구현해주지 않으면 옵저버블 스트림이 종료된 것도 아니고, dispose된 것도 아니다. 이 경우, Disposed도 출력하지 않고, 계속 옵저버블 스트림이 유지되어 메모리 누수(memory leak)이 발생하게 되는 것이다!

 

Ref:

https://github.com/ReactiveX/RxSwift/blob/main/RxSwift/Observables/Create.swift

 

GitHub - ReactiveX/RxSwift: Reactive Programming in Swift

Reactive Programming in Swift. Contribute to ReactiveX/RxSwift development by creating an account on GitHub.

github.com

http://reactivex.io/documentation/operators.html

 

ReactiveX - Operators

Introduction Each language-specific implementation of ReactiveX implements a set of operators. Although there is much overlap between implementations, there are also some operators that are only implemented in certain implementations. Also, each implementa

reactivex.io

 

728x90
반응형