[RxSwift] Operators - deferred
👨🏻‍💻iOS 공부/RxSwift

[RxSwift] Operators - deferred

728x90
반응형

Creating 카테고리에 속하는 deferred에 대해서 알아볼 것이다. 

공식문서에는 defer라고 되어있지만, RxSwift에서는 deferred로 사용한다. 

 

deferred

1. 정의

defer라는 단어의 뜻처럼 옵저버블의 생성을 "지연"하는 역할을 한다. deferred는 옵저버가 구독하기 전까지 옵저버블을 생성하지 않도록 하며, 구독 이후에는 각 옵저버 별로 새로운 옵저버블을 생성해준다. 

 

deferred

 

2. 구현

public static func deferred(_ observableFactory: @escaping () throws -> Observable<Element>) 
    -> Observable<Element> {
    Deferred(observableFactory: observableFactory)
}

클로저를 통해 옵저블을 생성해주는데, 앞서 말했던 것 처럼, 옵저버블이 구독될 때까지 생성을 미루게 된다. 

3. 사용 예시

즉시 옵저버블을 생성하는 create와 달리 구독을 해줘야 옵저버블이 생기기 때문에, 당장은 필요하지 않지만 필요한 상황에 구독하여 생성할 수 있다. 

 

네트워크 API에서 결과를 받아와 just처럼 옵저버블을 바로 만들어 주는 경우도 있지만, deferred를 통해 구독 전가지 해당 네트워크 요청을 시작하지 않도록 해줄 수 있다.

 

var touched = true

let factory = Observable<Int>.deferred {
	touched.toggle()
    
    if touched {
        return Observable.of([1,2,3])
    } else {
        return Observable.of([4,5,6])
    }
}

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

// 123

factory.subscribe(onNext: {
    print($0)
}).disposed(by: disposeBag)
// 456

이와 같이, 구독을 했을 때 옵저버블이 생기기 때문에 사전에 조건을 걸어서 조건에 따라 다른 값들을 반환해줄 수도 있다!

 


Ref: 

https://github.com/ReactiveX/RxSwift/blob/main/RxSwift/Observables/Deferred.swift

 

GitHub - ReactiveX/RxSwift: Reactive Programming in Swift

Reactive Programming in Swift. Contribute to ReactiveX/RxSwift development by creating an account on GitHub.

github.com

http://reactivex.io/documentation/operators/defer.html

 

ReactiveX - Defer operator

The Defer operator waits until an observer subscribes to it, and then it generates an Observable, typically with an Observable factory function. It does this afresh for each subscriber, so although each subscriber may think it is subscribing to the same Ob

reactivex.io

https://www.raywenderlich.com/books/rxswift-reactive-programming-with-swift/v4.0/chapters/2-observables

 

RxSwift: Reactive Programming with Swift, Chapter 2: Observables

Now that you’re ready to use RxSwift and have learned some of the basic concepts, it’s time to play around with observables.

www.raywenderlich.com

https://stackoverflow.com/questions/36313946/difference-between-observable-defer-and-observable-create-in-java-rx

 

Difference between Observable.defer and Observable.create in java rx

Can someone explain me the difference between defer and create methods in Observable? I failed to understand when I should use defer and when should I use create .. REFERENCES: Defer: http://reac...

stackoverflow.com

 

728x90
반응형