[RxSwift] RxSwift - Observable 만들기

임주희·2022년 11월 29일
0

RxSwift

목록 보기
3/5

번역된 글이라 설명이 매끄럽진 않지만. 목록을 보기 위해 캡쳐해왔다.
(출처는 글 하단에 기재)
하나씩 사용하여 Observable을 생성해보자.

Observable 만들기

Create

  • Observable을 처음부터 생성
  • Observable 직접 만들기, DIY Observable
Observable.create { observer -> Disposable in
    observer.onNext(1)
    observer.onNext(2)
    observer.onCompleted() //<- 여기서 종료됨
    observer.onNext(3) //<- 방출안됨
    return Disposables.create()
}.subscribe(onNext: { // 구독
    print($0)
}, onError: {
    print($0)
}, onCompleted: {
    print("Completed")
}, onDisposed: {
    print("Disposed")
})
.dispose()

출력

1
2
Completed
Disposed

observer.onNext(3)은 onCompleted() 된 이후이기 때문에 방출되지 않는다.


Defer

  • 관찰자가 구독할 때까지 Observable을 생성하지 않고, 각 관찰자에 대해 새로운 Observable을 생성
  • subscribe를 기다리는 Observable을 만드는 대신, 각 subscribe에게 새롭게 Observable항목을 제공하는 Observable Factory를 만드는 방식
  • deferred을 사용하면 observableFactory를 통해 Observable 생성할 수 있다.
Observable.deferred {
    Observable.of(1, 2, 3)
}
.subscribe{
    print($0)
}
.dispose()

출력

next(1)
next(2)
next(3)
completed

→ 내부에 있는 Observable을 구독한 것과 유사하게 동작한다.


deferred을 사용하면 observableFactory를 통해 Observable 생성할 수 있다.
public static func deferred(_ observableFactory: @escaping () throws -> Observable<Element>)
        -> Observable<Element> {
        Deferred(observableFactory: observableFactory)
    }

observableFactory
Observable을 감싸는 또 다른 Observable

var isDay: Bool = false
let factory: Observable<String> = Observable.deferred {
    isDay = !isDay
    
    // 조건문에 따라 다른 Observable을 리턴할 수 있다.
    if isDay {
        return Observable.of("🌞")
    } else {
        return Observable.of("🌙")
    }
}
for _ in 0...3 {
    factory.subscribe(onNext: {
        print($0)
    })
    .dispose()
}

출력

🌞
🌙
🌞
🌙

상태에 따라 다른 데이터를 처리해야할 필요가 있을 경우 사용

Empty

  • 항목을 방출하지 않지만 정상적으로 종료되는 Observable 생성
  • 아무런 이벤트도 방출하지 않음, 요소를 갖지 않는 Observable 생성
  • 즉시 종료할 수 있는 Observable, 의도적으로 0개의 값을 리턴하는 Observable을 만들 때 사용한다.
Observable.empty()
    .subscribe{
        print($0)
    }
    .dispose()

→ 출력 없음 (아무것도 안나옴, completed도 안나옴)

이렇게 하면 출력 나옴

Observable.empty()
    .subscribe(
        onNext: {
            print($0)
        },
        onCompleted: {
            print("Completed")
        })
    .dispose()

출력

Completed

Never

항목을 방출하지 않고 종료되지 않는 Observable 생성

Observable.never()
    .subscribe(
        onNext: {
            print($0)
        },
        onCompleted: {
            print("Completed")
        })
    .dispose()

→ 출력 없음

디버그를 통해서만 작동 여부를 확인할 수 있음

Observable.never()
    .debug("never") //← 디버그
    .subscribe(
        onNext: {
            print($0)
        },
        onCompleted: {
            print("Completed")
        })
    .dispose()

출력

2022-11-30 00:58:24.688: never -> subscribed
2022-11-30 00:58:24.697: never -> isDisposed

Throw

항목을 방출하지 않고 오류와 함께 종료되는 Observable 생성

Interval

Just

하나의 element만 방출, 오직 하나의 요소만을 포함하는 Observable 생성

Observable.just(1)
    .subscribe {
        print($0)
    }
    .dispose()

출력

next(1)
completed

Range

특정 범위의 순차 정수를 방출하는 Observable 생성
Start부터 Count크기 만큼의 값들을 순차적으로 방출한다.
for문 같다.

Observable.range(start: 1, count: 5)
    .subscribe {
        print($0)
    }
    .dispose()

출력

next(1)
next(2)
next(3)
next(4)
next(5)
completed

Repeat

start

Timer

of

하나 이상의 요소를 넣을 수 있음, 순차적

Observable.of(1, 2, 3)
    .subscribe {
        print($0)
    }.dispose()

출력

next(1)
next(2)
next(3)
completed

💡 of에 배열을 넣으면 하나의 Array타입으로 인식함

Observable.of([1, 2, 3])
    .subscribe({
        print($0)
    })
    .dispose()

// 출력
// next([1, 2, 3])
// completed

// Observable<Array>.of([1, 2, 3]) ----- 하나의 Array 타입으로 인식
// Observable.just([1, 2, 3]) ----- just와 동일하게 동작한다.

From

Array의 각 element들을 하나씩 방출

Observable.from([1, 2, 3])
    .subscribe {
        print($0)
    }
    .dispose()

출력

next(1)
next(2)
next(3)
completed


[출처] reactivex.io
[출처] ReactiveX/RxSwift: Reactive Programming in Swift - GitHub

0개의 댓글