안녕하세요, iOS 개발하는 루피입니다.
이번 시간은 공식문서를 바탕으로 Create와 Defer에 대해 공부해 보도록 하겠습니다. 그러면 시작하겠습니다.
Create : 함수를 이용하여 처음부터 Observable 생성하기

Create 연산자를 사용하여 처음부터 Observable을 생성할 수 있습니다. 이 연산자에 옵저버를 매개변수로 받는 함수를 전달합니다. 이 함수는 옵저버의 onNext, onError, onCompleted 메서드를 적절히 호출하여 Observable처럼 동작하도록 작성합니다. 올바르게 구성된 유한한 Observable은 옵저버의 onCompleted 메서드를 정확히 한 번 호출하거나, 또는 onError메서드를 정확히 한 번 호출해야 하며, 그 이후에는 옵저버의 다른 메서드를 호출해서는 안 됩니다.
예를 들어 코드를 살펴 보면,
let source : Observable = Observable.create { observer in
for i in 1...5 {
observer.on(.next(i))
}
observer.on(.completed)
// Note that this is optional. If you require no cleanup you can return
// `Disposables.create()` (which returns the `NopDisposable` singleton)
return Disposables.create {
print("disposed")
}
}
source.subscribe {
print($0)
}
Defer : 옵저버가 구독할 때까지 Observable을 생성하지 않고, 각 옵저버에 대해 새로운 Observable을 생성합니다.

Defer 연산자는 옵저버가 구독할 때까지 기다렸다가, 그때 Observable을 생성합니다. 일반적으로는 Observable을 생성하는 팩토리 함수를 사용하여 이를 수행합니다. 각 구독자마다 새로운 Observable을 생성하기 때문에, 각 구독자는 동일한 Observable을 구독하고 있다고 생각할 수 있지만, 실제로는 각 구독자마다 고유한 시퀀스를 받게 됩니다.
예를 들어 코드를 살펴보면..
import RxSwift
// DisposeBag 생성
let disposeBag = DisposeBag()
// 현재 시간을 반환하는 함수
func getCurrentTime() -> String {
return Date().description
}
// Defer 연산자를 사용하여 Observable 생성
let deferredObservable = Observable<String>.deferred {
// 구독 시점에 새로운 Observable 생성
return Observable.just("Current Time: \(getCurrentTime())")
}
// 첫 번째 구독
deferredObservable.subscribe(
onNext: { event in
print("Subscriber 1: \(event)")
}
).disposed(by: disposeBag)
// 약간의 지연을 준 후 두 번째 구독
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
deferredObservable.subscribe(
onNext: { event in
print("Subscriber 2: \(event)")
}
).disposed(by: disposeBag)
}
// Subscriber 1: Current Time: 2024-10-02 10:00:00 +0000
// Subscriber 2: Current Time: 2024-10-02 10:00:02 +0000
그렇다면 Defer 를 사용하는 이유는 도대체 무엇일까요???
1. 최신 데이터 확보
데이터를 동적으로 생성해야 하거나 시점마다 달라지는 데이터를 발행해야 하는 경우 유용합니다.
2. 지연된 생성 및 리소스 관리
불필요하게 미리 Observable을 생성하지 않아도 되며, 리소스를 효율적으로 사용할 수 있습니다. 예를 들어, 데이터베이스 연결이나 네트워크 요청과 같이 리소스가 많이 드는 작업을 구독 시점에 수행하도록 할 때 유용합니다.
3. 각 구독자마다 독립적인 시퀀스 생성
각 구독자가 Observable을 구독할 때마다 새로운 시퀀스가 생성되기 때문에, 구독자들은 서로 독립적인 이벤트 시퀀스를 받게 됩니다. 이로 인해 구독자 간의 데이터 상태나 시퀀스의 공유가 필요 없는 경우에 매우 효과적입니다.
4. 의도한 동작 보장
어떤 경우에는 Observable의 생성과 발행이 정확한 타이밍에 발생해야 합니다. Defer를 사용하면 구독이 일어날 때마다 Observable을 생성하게 되어 이러한 의도한 동작을 보장할 수 있습니다.
예를 들어, 특정 조건에 따라 다른 데이터를 발행하는 Observable을 만들고 싶을 때, 구독 시점에 조건을 확인하고 그에 따라 적절한 Observable을 생성하는 로직을 Defer로 처리할 수 있습니다.
이상으로 정리를 마무리하도록 하겠습니다. 피드백은 언제든지 환영입니다!!
'iOS > RxSwift' 카테고리의 다른 글
[RxSwift] From / Just / Of / Repeat / Interval / Timer / Range (0) | 2024.12.20 |
---|---|
[RxSwift] Empty / Never / Throw (0) | 2024.12.20 |
[RxSwift] Map / FlatMap (0) | 2024.12.20 |
[RxSwift] Subject (0) | 2024.12.20 |
[RxSwift] Observable (0) | 2024.12.20 |