Observable을 생성할 때 직접 Observable을 생성할 수도 있고, RxSwift의 sugar API를 사용해서 만들 수도 있다.
💡 Sugar API란?
RxSwift에서 "Sugar API"는 코드의 간결성을 높이고 가독성을 향상시키기 위한 편의 메서드들을 의미한다. 이 API들은 기본적인 RxSwift의 연산자들을 더 쉽게 사용할 수 있도록 도와준다.
Observable의 종류를 Sugar API를 사용하는 예시로 알아보자!
파라미터로 Observer를 매개변수로 받는 클로저를 전달받는 Observable Sequence를 생성한다. 매개변수로 받은 Observer의 onNext, onCompleted, onError 메서드를 직접 호출할 수 있다. 클로저가 끝나기 전에 반드시 onCompleted이나 onError를 정확히 1번 호출해야 하고, onCompleted나 onError 호출 시 dispose 된다.
let observable = Observable<String>.create { observer in
observer.onNext("첫 번째 방출")
observer.onNext("두 번째 방출")
observer.onCompleted()
observer.onNext("세 번째 방출")
return Disposables.create()
}
// "첫번째 방출", "두번째 방출" 이후 "세번째 방출"은 방출되지 않는다.
just는 단일 요소를 방출하는 Observable을 생성한다. 배열을 방출시 각각 배열의 요소를 따로 방출하는게 아니라 한번에 방출하고 바로 dispose 된다.
let disposeBag = DisposeBag()
let observable = Observable.just("Hello, RxSwift!")
observable.subscribe(onNext: { value in
print(value)
}).disposed(by: disposeBag)
// "Hello, RxSwift!" 방출
of는 전달된 요소들을 순서대로 방출하는 Observable을 생성한다. 순서대로 방출하고 dispose 된다.
let disposeBag = DisposeBag()
let observable = Observable.of(1, 2, 3, 4, 5)
observable.subscribe(onNext: { value in
print(value)
}).disposed(by: disposeBag)
// 1, 2, 3, 4, 5를 순서대로 방출
from은 배열이나 리스트 등의 각 요소를 하나씩 방출하고 dispose되는 Observable을 생성한다.
let disposeBag = DisposeBag()
let observable = Observable.from([1, 2, 3, 4, 5])
observable.subscribe(onNext: { value in
print(value)
}).disposed(by: disposeBag)
// [1, 2, 3, 4, 5] 배열의 각 요소를 하나씩 방출
range는 특정 범위의 정수를 순차적으로 방출하고 dispose되는 Observable을 생성한다.
let disposeBag = DisposeBag()
let observable = Observable.range(start: 1, count: 5)
observable.subscribe(onNext: { value in
print(value)
}).disposed(by: disposeBag)
// 1부터 5까지 순차적으로 방출
empty는 아무런 요소도 방출하지 않고 즉시 onCompleted가 호출되고, dispose 되는 Observable을 생성한다.
let disposeBag = DisposeBag()
let observable = Observable<Int>.empty()
observable.subscribe(onNext: { value in
print(value)
}, onCompleted: {
print("Completed")
}).disposed(by: disposeBag)
never는 아무런 요소도 방출하지 않고 완료되지도 않는 Observable을 생성한다. 직접 dispose 메소드를 호출해야 dispose 된다. 주로 테스트 목적으로 사용된다.
let disposeBag = DisposeBag()
let observable = Observable<Int>.never()
observable.subscribe(onNext: { value in
print(value)
}, onCompleted: {
print("Completed")
}).disposed(by: disposeBag)
error는 즉시 에러를 방출하고 dispose 되는 Observable을 생성한다.
let disposeBag = DisposeBag()
let observable = Observable<Int>.error(NSError(domain: "", code: -1, userInfo: nil))
observable.subscribe(onNext: { value in
print(value)
}, onError: { error in
print("Error:", error)
}).disposed(by: disposeBag)
이 밖에도 다양한 Observable이 있다. ReactiveX의 페이지에서 확인 가능하다!
ReactiveX