RxSwift

[RxSwift] Creating Observables 정리

devharrry 2020. 5. 16. 21:59

RxSwift에서 생성 옵저버블에 대해서 정리해보려고 합니다.

 

1. Create 

Create는 직접적인 코드 구현을 통해 옵저버 메서드를 호출하여 옵저버블을 생성합니다. 

 

 

- 구현부 

 

public static func create(_ subscribe: @escaping (RxSwift.AnyObserver<Self.Element>) -> RxSwift.Disposable) -> RxSwift.Observable<Self.Element>

subscribe 파라미터는 AnyObserver를 가져와 Disposable을 반환하는 이스케이프 클로저입니다. 

 

- 예제

Observable<String>.create { observer in 
    observer.onNext("A")
    observer.onCompleted()
    
    return Disposables.create()
}.subscribe(
    onNext: { print($0) },
    onError: { print($0) }, 
    onCompleted: { print("Completed") }, 
    onDisposed: { print("Disposed") }
).disposed(by: disposeBag)

// print 
A
Completed 
Disposed

 

2. Defer 

Defer는 옵저버가 구독하기 전까지 옵저버블 생성을 지연하고 구독이 시작되면 옵저버 별로 새로운 옵저버블을 생성합니다. 

 

- 구현부

public static func deferred(_ observableFactory: @escaping () throws -> RxSwift.Observable<Self.Element>) -> RxSwift.Observable<Self.Element>

 

- 예제

let a = ["a", "a"]
let b = ["b", "b"]
var flag = true 

let observable: Observable<String> = Observable.deferred {
    flag = !flag
    if flag {
        return Observable.from(a)
    } else {
        return Observable.from(b)
    }
}

observable
    .subscribe { print($0) }
    .disposed(by: disposeBag)

// print
a
a
completed

observable
    .subscribe { print($0) }
    .disposed(by: disposeBag)

// print
b
b
completed

 

3. Just

Just는 하나의 항목을 방출하는 옵저버블을 생성합니다. 

 

 

- 구현부 

public static func just(_ element: Self.Element) -> RxSwift.Observable<Self.Element>

- 예제 

let disposeBag = DisposeBag() 

// 1)
Observable.just(1)
    .subscribe { event in print(event) }
    .disposed(by: disposedBag)
    
// print
next(1)
completed 

// 2)
Observable.just([1, 2, 3])
    .subscribe { event in print(event) }
    .disposed(by: disposedBag)
// print
next([1, 2, 3])
completed

 

4. of 

두 개 이상의 요소를 방출하는 옵저버블을 생성합니다. 

 

- 구현부 

public static func of(_ elements: Self.Element..., scheduler: RxSwift.ImmediateSchedulerType = CurrentThreadScheduler.instance) -> RxSwift.Observable<Self.Element>

 

- 예제

Observable.of(1, 2, 3)
    .subscribe { element in print(element) }
    .disposed(by: disposedBag)
    
// print
next(1)
next(2)
next(3)
completed

 

5. from 

배열에 포함된 요소를 하나씩 순서대로 방출하는 옵저버블을 생성합니다. 

 

 

 

- 구현부 

public static func from(_ array: [Self.Element], scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> RxSwift.Observable<Self.Element>

 

- 예제 

Observable.from([1,2,3])
    .subscribe{ element in print(element) }
    .disposed(by: disposeBag)
    
// print
next(1)
next(2)
next(3)
completed


6.range 

연속된 범위(Range)의 정수를 발행하는 옵저버블을 생성합니다. 

 

증가되는 크기를 바꾸거나 감소하는 시퀀스를 생성하는 것은 불가능합니다. (그러기 위해서는 7.generate를 사용해야합니다)

 

 

- 구현부 

public static func range(start: Element, count: Element, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element>

 

- 예제

Observable.range(start: 1, count: 10)
    .subscribe { print($0) }
    .disposed(by: disposeBag)

// print
next(1)
next(2)
..
next(10) 

 

7.generate

 

- 구현부 

public static func generate(initialState: Element, condition: @escaping (Element) throws -> Bool, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance, iterate: @escaping (Element) throws -> Element) -> Observable<Element>

initialState: 시작 값(가장 먼저 방출되는 값)

condition: 조건이 true일 경우에만 요소가 방출됨 (false일 경우 completed)

iterate: 값을 증가시키거나 감소시킬 경우 사용 

 

- 예제

Observable.generate(initialState: 0, condition: { $0 <= 10 }, iterate: { $0 + 2 })
    .subscribe { print($0) }
    .disposed(by: disposeBag) 
    
// print
next(0)
next(2)
next(4)
next(6)
next(8)
next(10)
completed

 

8.repeatElement

특정 요소를 반복적으로 방출하는 옵저버블을 생성합니다. 

 

 

- 구현부 

public static func repeatElement(_ element: Element, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element>

- 예제

Observable.repeatElement("A")
    //.take(7) // 7개만 방출하고 종료 
    .subscribe { print($0) }
    .disposed(by: disposeBag) 

// print
"A"
...
무한루프 

 

9. empty, never, throw

요소를 방출하지 않고 정확하고 제한된 행동을 하는 옵저버블을 생성합니다. 

 

1) empty : 항목은 없지만 정상적으로 종료되는 옵저버블 

- 구현부 

public static func empty() -> RxSwift.Observable<Self.Element>

- 예제

Observable<Void>.empty()
    .subscribe { print($0) }
    .disposed(by: disposeBag)
    
// print 
completed 

 

 

2) never : 항목을 방출하지 않고 종료하지 않는 옵저버블

 

- 구현부 

public static func never() -> RxSwift.Observable<Self.Element>

- 예제

Observable<Void>.empty()
    .subscribe { print($0) }
    .disposed(by: disposeBag)
    
// print 
never는 complete 호출되지 않음.  


3) error : 항목을 방출하지 않고 오류로 종료되는 옵저버블 

- 구현부

public static func error(_ error: Error) -> RxSwift.Observable<Self.Element>

 

- 예제 

enum MyError: Error {
    case error
}

Observable<Void>.error(MyError.error)
    .subscribe { print($0) }
    .disposed(by: disposeBag)
    
// print 
error(error)

 

참고 http://reactivex.io/

'RxSwift' 카테고리의 다른 글

[RxSwift] Subject 정리  (1) 2020.05.24
[RxSwift] 옵저버블(Observable)이란?  (1) 2020.05.16
RxSwift란  (0) 2020.05.16
RxSwift Summary 카테고리 포스트 계획  (0) 2020.05.16