[RxSwift] - Creating Operator (Create,Just, From, Of, Range, Defer, Empty)

sun02·2022년 2월 8일
0

RxSwift

목록 보기
2/12

Creating Observables

새로운 observable들을 생성하는 연산자

1. Create

: observer 메서드를 코드로 호출하여 처음(from scratch) observable 생성

Create 연산자를 사용해서 observable을 처음 만들 수 있습니다.
observer를 매개변수로 가지는 함수를 이 연산자에 전달합니다.
observer의 onNext, onError, onCompleted 메서드를 적절하게 호출하여 이 함수가 observable처럼 작동하도록 할 수 있습니다.

잘 만들어진 유한한 observable은 observer의 onCompleted나 onError 메서드를 정확히 한 번 호출해야합니다. 또한 그 이후에는 observer의 다른 메서드를 호출하지 않습니다.

array에서 element를 반환하는 observable 생성예제입니다.

func myFrom<E>(_ sequence: [E]) -> Observable<E> {
    return Observable.create { observer in
        for element in sequence {
            observer.on(.next(element))
        }
        observer.on(.completed)
        return Disposables.create()    
   }
}

let stringCounter = myFrom(["first", "second"])

stringCounter
    .subscribe(onNext: { n in
        print(n)
    })

// 실행 시 아래를 출력합니다.
first
second

2. Just

: 특정한 한 item만 방출(emit)하는 Observable을 생성합니다.

Just 연산자는 한 item을 해당 item만 방출하는 Observable로 변환합니다.
From 연산자와 유사하지만, From은 배열이나 iterable에서 방출할 item을 가져오는 반면 Just는 배열이나 iterable을 single item으로 그대로 방출합니다.

let source = Observable.just([1,2,3])

source2.subscribe {
    print($0)
}

// 또는

Observable<[Int]>.just([1,2,3])
    .subscribe(onNext: {
        print($0)
    })

//실행 시 아래를 출력합니다
next([1,2,3])
completed
// 또는
[1,2,3]

3. From

다양한 객체와 데이터 유형을 Observable로 변환합니다.

오직 배열만 받을 수 있으며, 배열안의 각각의 요소를 하나씩 emit 합니다.

let numbers = [1,2,3,4,5]

let source = Observable.from(numbers)

source.subscribe {
    print($0)
}

// 또는

Observable.from([1,2,3,4,5])
    .subscribe(onNext: {
        print($0)
    })

// 실행 시 아래를 출력합니다.
next(1)
next(2)
next(3)
next(4)
next(5)
completed
// 또는
1
2
3
4
5

4. Of

: element를 여러개 가진 새로운 observable을 생성합니다.

하나 이상의 event를 emit 할 수 있는 observable sequence


Observable<Int>.of(1,2,3,4,5)
    .subscribe(onNext: {
        print($0)
    })
    

// 실행 시 아래를 출력합니다.
1
2
3
4
5


Observable.of([1,2,3,4,5])
    .subscribe(onNext: {
        print($0)
    })

// 실행 시 아래를 출력합니다.
[1,2,3,4,5]

5. Empty, Never

5-1. Empty

: 어떠한 element도 배출하지 않지만 정상적으로 종료하는 observable 생성

Observable<Void>.empty()
    .subscribe {
        print($0)
    }

// 실행 시 다음을 출력합니다.
completed

5-2. Never

: 어떠한 element도 배출하지 않고 종료하지도 않는 observable 생성

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

// 실행 시 다음을 출력합니다

  • 아무것도 출력되지 않습니다.

Empty, Never 연산자는 매우 구체적이고 제한된 행동을 하는 observable을 생성합니다.
주로 테스트를 위해 유용하게 사용됩니다.

6. Range

: 연속적인 정수의 특정 범위를 방출하는 observable 생성


Observable.range(start:3, count:6)
    .subscribe(onNext: {
        print($0)
    })

// 실행 시 다음을 출력합니다.
3
4
5
6
7
8

7. Defer

: observer가 구독할 때까지 observable을 생성하지 않고, 각 observer에 대해 새로운 observable을 생성

Defer 연산자는 observer가 구독할 대까지 기다린 후에 일반적으로 observable 팩토리 함수를 사용해서 observable을 생성합니다.
Defer 연산자는 각 observer에 대해 이 작업을 새로 수행하기 때문에 subscriber는 동일한 observable을 구독한다고 생각할 수 있지만, 실제로 각 subscriber는 고유한 개별 sequence를 가집니다.

var flip: Bool = false

let factory: Observable<String> = Observable.deferred {
    flip = !flip
    
    if flip {
        return Observable.of("A")
    } else {
        return Observable.of("B")
    }
}
for _ in 0...3 {
    factory.subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)
}

// 실행 시 다음을 출력합니다.
A
B
A
B

출처 : Reactive X - Operator
FastCampus - iOS 강의

0개의 댓글