iOS - RxSwift / Observable

이한솔·2024년 6월 30일
0

iOS 앱개발 🍏

목록 보기
49/53

Observable

Observable을 생성할 때 직접 Observable을 생성할 수도 있고, RxSwift의 sugar API를 사용해서 만들 수도 있다.

💡 Sugar API란?
RxSwift에서 "Sugar API"는 코드의 간결성을 높이고 가독성을 향상시키기 위한 편의 메서드들을 의미한다. 이 API들은 기본적인 RxSwift의 연산자들을 더 쉽게 사용할 수 있도록 도와준다.



Observable의 종류

Observable의 종류를 Sugar API를 사용하는 예시로 알아보자!

create

파라미터로 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

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

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

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

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

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

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

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

0개의 댓글