RxSwift Observable 흐름

2024. 8. 25. 14:40

Observable 은 데이터가 흐르는 Stream이다.

Observable은 데이터가 흐르는 Stream이라고 표현하기도 합니다. Observable은 일반적으로 선언하는 변수와 다르게 Stream의 성질을 갖기 때문입니다.

let name = "KH"
var mbti = "INTJ"

이렇게 선언한 값들은 한 번 값을 가지면 그 값 자체로 의미를 갖습니다. 하지만 Observable은 계속해서 새로운 값을 "방출"해 낼 수 있습니다. 이를 구독자들은 값이 방출되었을 때, 그것에 곧바로 반응을 합니다.

import UIKit
import RxSwift

class ViewController: UIViewController {
    
    // 구독을 끝낸 뒤 구독을 해제하기 위한 disposeBag
    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        test()
    }
    
    func test() {
        
        // Observable 선언, onNext로 이벤트 방출
        let nameObservable: Observable<String> = Observable.create { observer in
            observer.onNext("Adam")
            observer.onNext("Eve")
            observer.onNext("Abel")
            return Disposables.create()
        
        }
        
        // 이게 구독 한 것,
        nameObservable.subscribe(onNext: { value in
            print("이름: \(value)")
        }).disposed(by: disposeBag) // ViewController가 생명주기를 다하고 메모리가 사라질 때, 구독도 사라짐.
    }
    
// 출력
// 이름: Adam
// 이름: Abel
// 이름: Abel
import UIKit
import RxSwift

class ViewController: UIViewController {
    
    // 구독을 끝낸 뒤 구독을 해제하기 위한 disposeBag
    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        test2()
    }
 
 func test2() {
        // 1초마다 값을 방출하는 옵저버블
        let someObservable = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance).take(5)
        
        // 여기가 구독
        someObservable.subscribe(onNext: { value in
            print("방출된 값: \(value)")
        }, onCompleted: {
            print("Completed")
        }).disposed(by: disposeBag) // 구독해제
        
        print("Hello")
    }
}
// 출력
// Hello
// 방출된 값: 0
// 방출된 값: 1
// 방출된 값: 2
// 방출된 값: 3
// 방출된 값: 4
// Completed

Single이란?

: 옵저버블 중에서, 오직 하나의 값만을 방출하는 옵저버블을 Single이라 함.

  • onSuccess : 옵저버블의 onNext와 동일
  • onFailure : 옵저버블의 onError와 동일
import UIKit
import RxSwift

class ViewController: UIViewController {
    
    // 구독을 끝낸 뒤 구독을 해제하기 위한 disposeBag
    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        test3() // test3 출력
    }
    
    func test3() {
        
        let single = Single.create { observer in // single로 하나의 값을 방출
            observer(.success("Adam")) // 그 값이 성공적이라면 "Adam"
            return Disposables.create()
        }
        
        // 구독
        single.subscribe(onSuccess: { value in
            print(value)
        }).disposed(by: disposeBag)// 구독 해제
    }
}

// 출력
// Adam

Subject 란?

: 옵저버블 중에서 외부에서 값을 넣어줄 수 있는 옵저버블을 Subject라고 함

  • BehaviorSubject : 초기값이 있는 Subject. 구독시 가장 최근에 방출된 값을 받음.
  • PublicSubject : 초기값이 없는 Subject. 구독 이후로 방출된 값을 받음.
import UIKit
import RxSwift

class ViewController: UIViewController {
    
    // 구독을 끝낸 뒤 구독을 해제하기 위한 disposeBag
    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        test3() // test3 출력
    }
	
    func test4() {
        
        let subject = BehaviorSubject(value: 10)
        
        subject.subscribe(onNext: { value in
            print("값 방출: \(value)")
        }).disposed(by: disposeBag)
        
        subject.onNext(20)
        subject.onNext(30)
        
    }
}

// 출력
// 값 방출: 10
// 값 방출: 20
// 값 방출: 30
import UIKit
import RxSwift

class ViewController: UIViewController {
    
    // 구독을 끝낸 뒤 구독을 해제하기 위한 disposeBag
    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        test5()
    }
    
      
    func test5() {
        // PublishSubject 생성
        let subject = PublishSubject<Int>()
        
        subject.subscribe(onNext: { value in
            print("값 방출: \(value)")
        }).disposed(by: disposeBag)
        
        subject.onNext(20)
        subject.onNext(30)
    }
}

// 출력
// 값 방출: 20
// 값 방출: 30

 

BELATED ARTICLES

more