본문 바로가기
iOS/RxSwift

[RxSwift] Observable 생성 관련 메서드들

by 6cess 2024. 12. 3.

0. 공식 문서 먼저 정독

 

ReactiveX - Observable

Observable ReactiveX에서 옵저버는 Observable을 구독한다. Obseravable이 배출하는 하나 또는 연속된 항목에 옵저버는 반응한다. 이러한 패턴은 동시성 연산을 가능하게 한다. 그 이유는 Observable이 객체를

reactivex.io

 

1. just

단일 값을 발행한 후 onCompleted 이벤트 호출

let observable = Observable.just("Hello, RxSwift!")

observable.subscribe(
    onNext: { value in
        print(value) // 출력: Hello, RxSwift!
    },
    onCompleted: {
        print("Completed!") // 출력: Completed!
    }
)

 

2. from

배열이나 시퀀스를 요소 하나하나씩 순차적으로 발행

let observable = Observable.from([1, 2, 3, 4, 5])

observable.subscribe(
    onNext: { value in
        print(value) // 출력: 1, 2, 3, 4, 5
    },
    onCompleted: {
        print("Completed!") // 출력: Completed!
    }
)

 

3. of

가변 매개변수(인자의 개수가 가변적인)를 받아 여러 값을 순차적으로 발행

let observable = Observable.of("A", "B", "C", "D")

observable.subscribe(
    onNext: { value in
        print(value) // 출력: A, B, C, D
    },
    onCompleted: {
        print("Completed!") // 출력: Completed!
    }
)

 

4. empty

아무 값도 발행하지 않고 바로 onCompleted 이벤트 호출

let observable = Observable<Void>.empty()

observable.subscribe(
    onNext: { _ in
        print("이건 출력되지 않습니다.")
    },
    onCompleted: {
        print("Completed!") // 출력: Completed!
    }
)

 

5. never

아무 값도 발행하지 않고 onCompleted나 onError도 호출하지 않음

let observable = Observable<Void>.never()

observable.subscribe(
    onNext: { _ in
        print("호출되지 않습니다.")
    },
    onCompleted: {
        print("에러도 호출되지 않습니다.")
    }
)

 

6. error

에러 이벤트를 즉시 발행하고 종료

enum SampleError: Error {
    case somethingWentWrong
}

let observable = Observable<String>.error(SampleError.somethingWentWrong)

observable.subscribe(
    onNext: { value in
        print(value)
    },
    onError: { error in
        print("Error: \(error)") // 출력: Error: somethingWentWrong
    },
    onCompleted: {
        print("Completed!")
    }
)

 

7. create

데이터 발행 방식을 커스터마이징할 수 있음

let observable = Observable<String>.create { observer in
    observer.onNext("Start")
    observer.onNext("Processing")
    observer.onCompleted()
    
    return Disposables.create()
}

observable.subscribe(
    onNext: { value in
        print(value) // 출력: Start, Processing
    },
    onCompleted: {
        print("Completed!") // 출력: Completed!
    }
)

 

8. deffered

구독할 때마다 그 시점에서 새로운 Observable을 생성

var flip = false

let observable = Observable<String>.deferred {
    flip.toggle()
    return flip ? Observable.just("Yes") : Observable.just("No")
}

observable.subscribe(onNext: { print($0) }) // 출력: Yes
observable.subscribe(onNext: { print($0) }) // 출력: No

 

9. range

특정 범위의 정수를 순차적으로 발행

let observable = Observable.range(start: 1, count: 5)

observable.subscribe(
    onNext: { value in
        print(value) // 출력: 1, 2, 3, 4, 5
    },
    onCompleted: {
        print("Completed!") // 출력: Completed!
    }
)