์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[ RxSwift ] Subject๋ฅผ ์•Œ์•„๋ณด์ž

๐ŸŽ iOS/RxSwift

by AHN.Jihyeon 2024. 10. 11. 04:21

๋ณธ๋ฌธ

์ด๋ฏธ์ง€ ํด๋ฆญ ์‹œ ๊ณต์‹๋ฌธ์„œ๋กœ ์ด๋™



 

๐Ÿ”Ž  1 . Subject


Subject๋Š” ๋‹ค๋ฆฌ, ํ”„๋ก์‹œ ์—ญํ• ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ค‘๊ณ„ ์—ญํ• ์„ ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค. 

๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ๊ตฌ๋…์ž๋“ค์—๊ฒŒ ์žฌ์ „์†กํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋ฐœํ–‰ํ•œ๋‹ค. 

 

๋”ฐ๋ผ์„œ, Subject๋Š” ์˜ต์ €๋ฒ„์ด๋ฉด์„œ ๋™์‹œ์— ์˜ต์ €๋ฒ„๋ธ”์ด๋‹ค. 

Subject๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๋‹ค๋ฅธ ์˜ต์ €๋ฒ„๋ธ”์„ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๊ณ (์˜ต์ €๋ฒ„ ์—ญํ• ), ๋™์‹œ์— ์˜ต์ €๋ฒ„๋ธ”์ด๋ฏ€๋กœ ๊ตฌ๋…์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.  

* ์˜ต์ €๋ฒ„๋ธ”์€ ๋‹ค๋ฅธ ์˜ต์ €๋ฒ„๋ธ”์„ ๊ตฌ๋…ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ์˜ต์ €๋ฒ„๋„ ๋‹ค๋ฅธ ์˜ต์ €๋ฒ„์—๊ฒŒ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜์ง€ ๋ชปํ•œ๋‹ค. 

 

 

 

 

๐Ÿ”Ž  2. Subject์˜ ์ข…๋ฅ˜


Subject๋Š” .next ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›๊ณ , ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•  ๋•Œ๋งˆ๋‹ค ๊ตฌ๋…์ž์—๊ฒŒ ๋ฐฉ์ถœํ•œ๋‹ค. 

๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ต์ €๋ฒ„๋ธ”์€ cold ์˜ต์ €๋ฒ„๋ธ”๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋…์ž๊ฐ€ ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ์ฒ˜์Œ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•œ๋‹ค. 

ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๊ตฌ๋…์ž์—๊ฒŒ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ๊ณต์œ ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” Subject๋ฅผ ์ด์šฉํ•ด

ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ์„ ์—ฌ๋Ÿฌ ๊ตฌ๋…์ž์—๊ฒŒ ๋™์‹œ์— ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

Subject๋ฅผ ์‚ฌ์šฉํ•ด ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์„ ๋‘๊ฐœ์˜ ๊ตฌ๋…์ž๊ฐ€ ๊ณต์œ 

import RxSwift

let disposeBag = DisposeBag()

// PublishSubject ์ƒ์„ฑ
let subject = PublishSubject<String>()

// ์ฒซ ๋ฒˆ์งธ ๊ตฌ๋…์ž
subject.subscribe(onNext: { value in
    print("์ฒซ ๋ฒˆ์งธ ๊ตฌ๋…์ž๊ฐ€ ๋ฐ›์€ ๊ฐ’: \(value)")
}).disposed(by: disposeBag)

// ๋‘ ๋ฒˆ์งธ ๊ตฌ๋…์ž
subject.subscribe(onNext: { value in
    print("๋‘ ๋ฒˆ์งธ ๊ตฌ๋…์ž๊ฐ€ ๋ฐ›์€ ๊ฐ’: \(value)")
}).disposed(by: disposeBag)

// ์™ธ๋ถ€์—์„œ ์ด๋ฒคํŠธ ๋ฐฉ์ถœ
subject.onNext("๊ณต์œ ๋œ ์ด๋ฒคํŠธ 1")
subject.onNext("๊ณต์œ ๋œ ์ด๋ฒคํŠธ 2")

 

 

*์•„๋ž˜ ์ฝ”๋“œ ์˜ˆ์‹œ๋ฅผ ์ดํ•ดํ•  ๋•Œ ์ฐธ๊ณ *

๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ, ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๊ตฌ๋…์ž ์—ญํ• ์„ ํ•˜๊ฒŒ ๋œ๋‹ค. 

๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด onNext๋กœ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๊ทธ๊ฑธ ๊ตฌ๋…์ž(onNext ํด๋กœ์ € ๋ถ€๋ถ„)๊ฐ€ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. 

 

1. PublishSubject

๊ตฌ๋…์ด ์‹œ์ž‘๋œ ์ดํ›„ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋งŒ ๊ตฌ๋…์ž์—๊ฒŒ ๋ฐฉ์ถœํ•œ๋‹ค. 

๊ตฌ๋…์„ ๋ฉˆ์ถ”๊ฑฐ๋‚˜ .completed, .error ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด Subject๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ง€์†๋œ๋‹ค. 

 

์ ํ•ฉํ•œ ์ƒํ™ฉ

- ์ด์ „์˜ ์ด๋ฒคํŠธ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ 

- ๊ตฌ๋…์„ ์‹œ์ž‘ํ•œ ์ดํ›„๋ถ€ํ„ฐ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋งŒ ๋ฐ›๊ณ  ์‹ถ์„ ๋•Œ

- ์˜ˆ์‹œ) ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ์ฒ˜๋Ÿผ ๊ณผ๊ฑฐ์— ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ๊ธฐ๋ก์€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ , ๊ตฌ๋…์ด ์‹œ์ž‘๋œ ์ดํ›„์— ๋ฐœ์ƒํ•œ ํด๋ฆญ ์ด๋ฒคํŠธ๋งŒ ๋‹ค๋ฃจ๊ณ  ์‹ถ์„ ๋•Œ 

 

let publishSubject = PublishSubject<String>()

// 1.Subject๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด(onNext๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด)
publishSubject.onNext("์ด๋ฒคํŠธ 1")  // ์˜ต์ €๋ฒ„๋ธ”์ด ๊ตฌ๋…์ž์—๊ฒŒ ์ด๋ฒคํŠธ๋ฅผ ๋ฐฉ์ถœํ•˜์ง€๋งŒ ์•„์ง ๊ตฌ๋…์ž๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ „๋‹ฌ๋˜์ง€ ์•Š์Œ

// 2.๊ตฌ๋…์ž๊ฐ€ ๊ทธ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌ(onNext ํด๋กœ์ €๊ฐ€ ํ˜ธ์ถœ๋จ) 
// 3.value์— ์ด๋ฒคํŠธ๊ฐ€ ์ „๋‹ฌ๋˜๊ณ , print() ์‹คํ–‰
publishSubject.subscribe(onNext: { value in  // onNext ํด๋กœ์ € ๋ถ€๋ถ„์ด ๊ตฌ๋…์ž(subscriber)
    print("๋ฐ›์€ ์ด๋ฒคํŠธ: \(value)")
})

publishSubject.onNext("์ด๋ฒคํŠธ 2")  // ๊ตฌ๋… ํ›„ ์ด๋ฒคํŠธ๋งŒ ์ „๋‹ฌ๋จ


// ๊ตฌ๋… ์ „์ธ ์ด๋ฒคํŠธ1์€ ๋ฌด์‹œ๋˜๊ณ  ๊ตฌ๋… ์ดํ›„์ธ ์ด๋ฒคํŠธ2๋งŒ ์ „๋‹ฌ๋จ.

 

 

์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ ค๋ฉด, ๋ฒ„ํŠผ์˜ ์•ก์…˜๊ณผ onNext ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•ด์•ผํ•œ๋‹ค. 

๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ทธ ์ˆœ๊ฐ„์— onNext๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๊ทธ๋กœ์ธํ•ด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. 

 

๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ํ๋ฆ„:

๋ฒ„ํŠผ ํด๋ฆญ ์‹œ → button.rx.tap์ด ๊ฐ์ง€ → subject.onNext("๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ์Šต๋‹ˆ๋‹ค!")๊ฐ€ ํ˜ธ์ถœ๋จ → subject์˜ ๊ตฌ๋…์ž๊ฐ€ ๊ทธ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„์„œ print๋กœ ์ถœ๋ ฅํ•จ.

 

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    let disposeBag = DisposeBag()
    let subject = PublishSubject<String>() // Subject ์ƒ์„ฑ

    override func viewDidLoad() {
        super.viewDidLoad()

        // ๋ฒ„ํŠผ ์ƒ์„ฑ ๋ฐ ์„ค์ •
        let button = UIButton(type: .system)
        button.setTitle("์ด๋ฒคํŠธ ๋ฐœ์ƒ", for: .normal)
        button.frame = CGRect(x: 100, y: 100, width: 200, height: 50)
        self.view.addSubview(button)

        // ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ Subject์— ์ด๋ฒคํŠธ ๋ฐœ์ƒ (onNext ํ˜ธ์ถœ)
        button.rx.tap // ๋ฒ„ํŠผ์„ Rx๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€
            .subscribe(onNext: { [weak self] in
                self?.subject.onNext("๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ์Šต๋‹ˆ๋‹ค!")
            })
            .disposed(by: disposeBag)

        // Subject ๊ตฌ๋… ์„ค์ • (์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ฒ˜๋ฆฌ)
        subject.subscribe(onNext: { value in
            print("๋ฐ›์€ ์ด๋ฒคํŠธ: \(value)")
        }).disposed(by: disposeBag)
    }
}

 

 

 

 

2. BehaviorSubject

ํ•˜๋‚˜์˜ ์ดˆ๊ธฐ๊ฐ’์„ ๊ฐ€์ง„ ์ƒํƒœ๋กœ ์‹œ์ž‘ํ•˜์—ฌ, ์ƒˆ๋กœ์šด ๊ตฌ๋…์ž์—๊ฒŒ ์ดˆ๊ธฐ๊ฐ’ ๋˜๋Š” ์ตœ์‹ ๊ฐ’์„ ๋ฐฉ์ถœํ•œ๋‹ค. 

 

์ ํ•ฉํ•œ ์ƒํ™ฉ

- ๊ตฌ๋…์ž๊ฐ€ ์ด์ „์— ๋ฐœ์ƒํ•œ ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ๋ฐ์ดํ„ฐ๋„ ํ•„์š”๋กœ ํ•œ ๊ฒฝ์šฐ

- ์˜ˆ์‹œ) ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์ƒํƒœ๋‚˜ ์„ค์ • ๊ฐ’์ฒ˜๋Ÿผ ๊ณผ๊ฑฐ์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’์ด ์ค‘์š”ํ•  ๋•Œ.

           ๊ตฌ๋…์ž๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ€์žฅ ์ตœ์‹ ์˜ ๊ฐ’์„๊ฐ€์ ธ์™€์•ผํ•  ๋•Œ

 

let behaviorSubject = BehaviorSubject(value: "์ดˆ๊ธฐ๊ฐ’")

// ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ–ˆ์ง€๋งŒ ๊ณง๋ฐ”๋กœ ์ด๋ฒคํŠธ1์ด ๋ฐœ์ƒํ•˜๋ฉด์„œ ์ดˆ๊ธฐ๊ฐ’ ๋ฎ์–ด์“ฐ์—ฌ์ง.
behaviorSubject.onNext("์ด๋ฒคํŠธ 1")  // ์ด๋ฒคํŠธ1 ๋ฐฉ์ถœ. ๊ตฌ๋…์ž๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ผ๋‹จ ๊ธฐ์–ต๋งŒ ํ•˜๊ณ  ์žˆ์Œ

behaviorSubject.subscribe(onNext: { value in
    print("๋ฐ›์€ ์ด๋ฒคํŠธ: \(value)")     // ๊ตฌ๋…์ž๊ฐ€ ์ƒ๊ธฐ์ž๋งˆ์ž ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ธฐ์–ตํ•œ ๊ฐ’์ธ ์ด๋ฒคํŠธ1์„ ๋ฐ”๋กœ ๊ตฌ๋…์ž์—๊ฒŒ ์ „๋‹ฌ.
})

behaviorSubject.onNext("์ด๋ฒคํŠธ 2") // ์ด๋ฒคํŠธ2๊ฐ€ ๊ตฌ๋…์ž์—๊ฒŒ ์ „๋‹ฌ๋จ


//์ถœ๋ ฅ ๊ฒฐ๊ณผ
๋ฐ›์€ ์ด๋ฒคํŠธ: ์ด๋ฒคํŠธ 1
๋ฐ›์€ ์ด๋ฒคํŠธ: ์ด๋ฒคํŠธ 2


===============================
let behaviorSubject = BehaviorSubject(value: "์ดˆ๊ธฐ๊ฐ’") // ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •

// ๊ตฌ๋…์ž๊ฐ€ ์ƒ๊ธฐ๋ฉด ์ดˆ๊ธฐ๊ฐ’์„ ์ „๋‹ฌ
behaviorSubject.subscribe(onNext: { value in
    print("๋ฐ›์€ ์ด๋ฒคํŠธ: \(value)")
})

// ์ด์ œ onNext๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ถ”๊ฐ€ ์ด๋ฒคํŠธ ๋ฐฉ์ถœ
behaviorSubject.onNext("์ด๋ฒคํŠธ 1")
behaviorSubject.onNext("์ด๋ฒคํŠธ 2")

//์ถœ๋ ฅ ๊ฒฐ๊ณผ
๋ฐ›์€ ์ด๋ฒคํŠธ: ์ดˆ๊ธฐ๊ฐ’
๋ฐ›์€ ์ด๋ฒคํŠธ: ์ด๋ฒคํŠธ 1
๋ฐ›์€ ์ด๋ฒคํŠธ: ์ด๋ฒคํŠธ 2


===============================

let disposeBag = DisposeBag()

// ์ดˆ๊ธฐ ๊ฐ’์„ ๊ฐ€์ง„ BehaviorSubject ์ƒ์„ฑ
let subject = BehaviorSubject(value: "์ดˆ๊ธฐ ๊ฐ’")

// ์ฒซ ๋ฒˆ์งธ ๊ตฌ๋…์ž๊ฐ€ ๊ตฌ๋…
subject.subscribe(onNext: { value in
    print("์ฒซ ๋ฒˆ์งธ ๊ตฌ๋…์ž๊ฐ€ ๋ฐ›์€ ๊ฐ’: \(value)")
}).disposed(by: disposeBag)

// ์ƒˆ๋กœ์šด ๊ฐ’ ๋ฐฉ์ถœ
subject.onNext("์ƒˆ๋กœ์šด ๊ฐ’ 1")

// ๋‘ ๋ฒˆ์งธ ๊ตฌ๋…์ž๊ฐ€ ๊ตฌ๋… (์ด์ „ ๊ฐ’์ธ '์ƒˆ๋กœ์šด ๊ฐ’ 1'์„ ๋ฐ›๊ฒŒ ๋จ)
subject.subscribe(onNext: { value in
    print("๋‘ ๋ฒˆ์งธ ๊ตฌ๋…์ž๊ฐ€ ๋ฐ›์€ ๊ฐ’: \(value)")
}).disposed(by: disposeBag)

 

 

3. ReplaySubject

์˜ต์ €๋ฒ„๊ฐ€ ๊ตฌ๋…์„ ์‹œ์ž‘ํ•œ ์‹œ์ ๊ณผ ๊ด€๊ณ„ ์—†์ด ์˜ต์ €๋ฒ„๋ธ”์ด ๋ฐฐ์ถœํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ๋“ค์„ ๋ชจ๋“  ๊ตฌ๋…์ž์—๊ฒŒ ๋ฐฉ์ถœํ•œ๋‹ค. 

๊ตฌ๋…์ž๊ฐ€ ์ƒ๊ธด ์ดํ›„์—๋„ ์ง€์ •๋œ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋งŒํผ ์ด์ „์— ๋ฐฉ์ถœ๋œ ์ด๋ฒคํŠธ๋ฅผ ๋‹ค์‹œ ๋ฐฉ์ถœํ•œ๋‹ค.

์ด๋กœ ์ธํ•ด ์ƒˆ๋กœ์šด ๊ตฌ๋…์ž๊ฐ€ ์ง€์ •๋œ ๋ฒ”์œ„ ๋‚ด์—์„œ์˜ ์ด์ „ ๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. -> ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•จ.

๋ฒ„ํผ์˜ ํฌ๊ธฐ๊ฐ€ ์ดˆ๊ณผ๋˜๋ฉด ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๊ฐ’๋ถ€ํ„ฐ ์‚ญ์ œ๋œ๋‹ค. 

 

์ ํ•ฉํ•œ ์ƒํ™ฉ

- ๊ฒ€์ƒ‰์ฐฝ์—์„œ ์ตœ๊ทผ 5๊ฐœ์˜ ๊ฒ€์ƒ‰์–ด๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์„ ๋•Œ

 

let disposeBag = DisposeBag()

// 2๊ฐœ์˜ ๋ฒ„ํผ๋ฅผ ๊ฐ€์ง„ ReplaySubject ์ƒ์„ฑ
let subject = ReplaySubject<String>.create(bufferSize: 2)

// ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ๋ฐฉ์ถœ
subject.onNext("์ด์ „ ๊ฐ’ 1")
subject.onNext("์ด์ „ ๊ฐ’ 2")
subject.onNext("์ด์ „ ๊ฐ’ 3")

// ์ƒˆ๋กœ์šด ๊ตฌ๋…์ž๊ฐ€ ๊ตฌ๋… (๊ฐ€์žฅ ์ตœ๊ทผ์˜ ๋‘ ๊ฐœ ๊ฐ’๋งŒ ๋ฐ›์Œ)
subject.subscribe(onNext: { value in
    print("๊ตฌ๋…์ž๊ฐ€ ๋ฐ›์€ ๊ฐ’: \(value)")
}).disposed(by: disposeBag)


// ์ถœ๋ ฅ ๊ฒฐ๊ณผ
๊ตฌ๋…์ž๊ฐ€ ๋ฐ›์€ ๊ฐ’: ์ด์ „ ๊ฐ’ 2
๊ตฌ๋…์ž๊ฐ€ ๋ฐ›์€ ๊ฐ’: ์ด์ „ ๊ฐ’ 3


/* ReplaySubject๋Š” ์ตœ๋Œ€ 2๊ฐœ์˜ ์ด๋ฒคํŠธ๋ฅผ ์บ์‹ฑํ•˜๊ณ  ์žˆ์Œ. 
์ƒˆ๋กœ์šด ๊ตฌ๋…์ž๋Š” ๋งˆ์ง€๋ง‰ ๋‘ ๊ฐœ์˜ ์ด๋ฒคํŠธ๋งŒ ๋ฐ›์Œ.
๋ฐ์ดํ„ฐ๋ฅผ ์ผ๋ถ€๋ถ„ ์บ์‹œํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ตฌ๋…์ž์—๊ฒŒ ์ œ๊ณตํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉ */

 

 

 

 

4. AsyncSubject

์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„์—๋งŒ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ์ „๋‹ฌํ•œ๋‹ค. 

onCompleted๊ฐ€ ํ˜ธ์ถœ๋œ ํ›„์—๋งŒ ๋งˆ์ง€๋ง‰ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. 

 

์ ํ•ฉํ•œ ์ƒํ™ฉ

- ๊ฒฐ๊ณผ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„์—๋งŒ ํŠน์ • ๊ฐ’์„ ์ „๋‹ฌํ•ด์•ผํ•  ๋•Œ 

- ์˜ˆ์‹œ) ๋ณต์žกํ•œ ๊ณ„์‚ฐ์ด ๋๋‚œ ํ›„ ๊ทธ ๊ฒฐ๊ณผ๋งŒ ์ „๋‹ฌํ•˜๋Š” ์ƒํ™ฉ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ๋๋‚ฌ์„ ๋•Œ ์ตœ์ข… ์‘๋‹ต ๋ฐ์ดํ„ฐ๋งŒ ์ „๋‹ฌํ•˜๋Š” ์ƒํ™ฉ 

 

let disposeBag = DisposeBag()

let subject = AsyncSubject<String>()

subject.subscribe(onNext: { value in
    print("๊ตฌ๋…์ž๊ฐ€ ๋ฐ›์€ ๊ฐ’: \(value)")
}).disposed(by: disposeBag)

// ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ๋ฐฉ์ถœํ•˜์ง€๋งŒ ์™„๋ฃŒ ์ „๊นŒ์ง€ ๊ตฌ๋…์ž๋Š” ๊ฐ’์„ ๋ฐ›์ง€ ์•Š์Œ
subject.onNext("์ด๋ฒคํŠธ 1")
subject.onNext("์ด๋ฒคํŠธ 2")

// ์™„๋ฃŒ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ๊ตฌ๋…์ž๊ฐ€ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ๋ฐ›์Œ
subject.onCompleted()


// ์ถœ๋ ฅ๊ฒฐ๊ณผ
๊ตฌ๋…์ž๊ฐ€ ๋ฐ›์€ ๊ฐ’: ์ด๋ฒคํŠธ 2

 

 

 

 

 

 

 

 

 

 

 

๐Ÿ”— Reference 

https://github.com/fimuxd/RxSwift/blob/master/Lectures/03_Subjects/Ch3.%20Subjects.md

 

'๐ŸŽ iOS > RxSwift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[ RxSwift ] Relay๋ฅผ ์•Œ์•„๋ณด์ž  (2) 2024.10.15
[ Rxswift ] Observable์„ ์•Œ์•„๋ณด์ž  (3) 2024.10.04

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ