RxSwift Observable 생성 (empty, never, range, interval, timer, defer)

2024. 8. 26. 09:24
반응형

Observable 생성하는 방법(empty, never, range, interval, timer, defer)

1. empty

: 어떠한 항목(item)eh 방출(emit)하지 않고, 즉시 onCompleted()를 호출하여 정상적으로 종료되는 Observable을 생성함

import UIKit
import RxSwift

class ViewController: UIViewController {

    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        test()
        
    }
    
    func test() {
        
        let observable = Observable<Void>.empty()
        
        observable.subscribe(onNext: { (data) in
            print(data)
        }, onCompleted: {
            print("onComplete")
        }, onDisposed: {
            print("onDispose")
            
            
        }).disposed(by: disposeBag)
    }


}

// 출력
// onComplete
// onDispose

말 그대로 비어서 어떠한 이벤트도 방출시키지 않음. 단, Empty Operator를 통해 Observable을 생성할 경우, onCompleted() 메서드를 호출 후 스트림이 정상 종료됨. 따라서, 어떠한 항목 방출 없이 바로 정상적으로 스트림을 종료하고 싶을 때 사용함.


2. never

: 어떠한 항목도 방출하지 않고 스트림이 종료되지도 않는 Observable을 생성함. 어떠한 항목도 방출하지 않는다는 점은 empty와 동일하나, never은 onCompleted()도 호출하지 않아, 스트림이 종료되지도 않음. 따라서, 직접 dispose를 실행시키거나, disposeBag를 이용해 dispose되기 전까지 절대 스트림이 종료되지 않음. 무한정 지속성을 나타낼 때 사용함

import UIKit
import RxSwift

class ViewController: UIViewController {

    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        test1()
        
    }
    
    func test1() {
        
        let observable = Observable<Void>.never()
        
        observable.subscribe(onNext: { (data) in
            print(data)
        }, onCompleted: {
            print("onComplete")
        }, onDisposed: {
            print("onDispose")
            
        }).disposed(by: disposeBag)
        
    }

}

// 출력값
// onDispose

해당 코드에서는 아무런 결과값이 나오지 않음. 이벤트를 방출하지도, completed를 통해 정상종료 되지도 않기 때문임. 해당 코드에서는 Observable이 dispose될 때 (disposeBag이 메모리에서 해제될 때) 그 땐 onDisposed 메서드가 실행되며 스트림이 종료됨


3. range

: 특정 범위의 "정수"를 순서대로 발행하는 Observable을 생성함. 해당 범위 안의 정수를 모두 발행한 경우, onCompleted()이 불리며 스트림이 종료됨. 

import UIKit
import RxSwift

class ViewController: UIViewController {

    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        test2()
        
    }
    
     func test2() {
        
        let observable = Observable<Int>.range(start: 0, count: 7) // 0부터 시작 7개까지, 제네릭은 생략 가능
        
        observable.subscribe(onNext: { (date) in // 여기서 date는 변수명?
            print(date)
        }, onCompleted: {
            print("onComplete")
        }, onDisposed: {
            print("onDispose")
            
        }).disposed(by: disposeBag)
    }

}

// 출력
// 0
// 1
// 2
// 3
// 4
// 5
// 6
// onComplete
// onDispose

정수를 발행하는 Observable이기 때문에, 다른 제네릭은 사용할 수 없음. 


출처 : 개발자 소들이

반응형

'Swift 언어 > RxSwift' 카테고리의 다른 글

RxSwift Subject의 Observable 역할  (1) 2024.09.03
RxSwift Observable생성 (just, of, from, create)  (0) 2024.08.25
RxSwift Observable 흐름  (0) 2024.08.25
RxSwift 개념  (0) 2024.08.25

BELATED ARTICLES

more