- ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ก์ฐ ์ํคํ ์ฒ์ ์ ์ฉ์ํค๊ธฐ ์ ๋ฆฌํจ
- ๋ฐ์ํ์ฑ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด์ ํ๋ก์ ํธ๋ฅผ ์๋ก ๋ง๋ค ํ์๋ ์์(์ผ๋ถ์ ์ฝ๋๋ค์ ๊ฐ๋จํ๊ฒ ๋ง๋ค๊ณ , ์๋ก์ด ๊ธฐ๋ฅ๋ค์ RxSwift๋ก ์ ์ํ๋ฉด ๋๊ฒ ๋ค)
- MVVM + RxSwift ์กฐํฉ
ใด ViewModel Observable<T> ํ๋กํผํฐ๋ฅผ ๋ฐฉ์ถํ๊ฒ ํ๋๋ฐ ์ด๋ View controller์ ๊ณ ์ ๋ ์ฝ๋์์ UIKit controls๊ฐ ์ง์ ์ ์ผ๋ก ๋ฐ์ธ๋ ๋๊ฒ ํ ์ ์์ -> Observable<T> ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํด์ UIKit์ Controls ์์๋ฅผ ์ต์ ๋น ํ ์ ์์
Podfile์์ 2022๋ 1์ ๊ธฐ์ค ์๋ pod ์ถ๊ฐ
pod 'RxSwift', '6.1.0'
pod 'RxCocoa', '6.1.0'
pod install ๋ก ์ค์น ์๋ฃ ํ ํ๋ก์ ํธ ์ฌ ์คํ.
mvvm๊ณผ swift์ ์กฐํฉ์ด ์ข๋ค๊ณ ํ๋๋ฐ ์์ง ์ ๋ชจ๋ฅด๊ฒ ๋น. ํด๋ ๋ถ๋ฆฌ!
xib์์ ์ค์์น๋ฅผ ํ๋ ์์ฑํ์ฌ constraint ์ฃผ๊ณ swift ํ์ผ๊ณผ IBOutlet ์ฐ๊ฒฐ
@IBOutlet weak var rxSwitch: UISwitch!
swift ํ์ผ์์ RxSwift์ RxCocoa๋ฅผ import ํด์ค๋ค ์ฃผ์ํด์ผ ํ ์ ์ RxCocoa๋ฅผ ํด์ฃผ์ด์ผ Rx์์ ์ฌ๋งํ uikit ๊ตฌํํด ๋์ ๊ธฐ๋ฅ์ ์ธ ์ ์์ผ๋ฏ๋ก ์์ง ๋ง๊ณ import ํด์ค๋น RxSwift ๋ง ํด์ฃผ๊ณ ๋ฒ์ ๋ฌธ์ ๋ก ์๋๋ ์ค ์๊ณ ์ด์ฉ์ง ํ๋๋ฐ ์ํฌํธ๋ง ์ ํด์ฃผ๋ฉด ๋๋๊ฑฐ์๋น
import UIKit
import RxSwift
import RxCocoa
class SwitchTestViewController: UIViewController {
@IBOutlet weak var rxSwitch: UISwitch!
override func viewDidLoad() {
super.viewDidLoad()
rxSwitch.rx.isOn
.subscribe { isOn in
print(isOn ? "์ค์์น ์ผ์ง" : "์ค์์น ๊บผ์ง")
}
}
}
import UIKit ์ ๊ฑฐํด์ค๋ ๋จ.
์ด๋ ๊ฒ ํด์ฃผ๋ฉด control์ ์ต์ ๋น ํ ๊ฒ ์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅํจ
UITextField, URLSession, UIViewController์์๋ ์ฌ์ฉ ๊ฐ๋ฅ. rx ๋ค์์คํ์ด์ค๋ก ๋ฆฌ์กํฐ๋ธ ์ต์คํ ์ ์ฌ์ฉ์ ์ ์๊ฐ ๊ฐ๋ฅํจ
Observables
- observable == observable sequence == sequence
ํนํ RxSwift์์๋ stream์ด๋ผ๋ ๋จ์ด๊ฐ ์๋ sequence๋ก ์ฌ์ฉ
- observable์ด์ผ ๋ง๋ก ์ํ์ค! ๋น๋๊ธฐ์์ ์ฌ์ฉํ ์ ์๋ ์์ฒญ๋ ํ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ํจ
- Observables๋ ์ผ์ ๊ธฐ๊ฐ ๋์ ๋ฐฉ์ถ์ด๋ผ๊ณ ํ๋ event๋ฅผ ๋ฐ์์ํด
- ์ด๋ฒคํธ๋ ๊ฐ์ ํฌํจํ ์ ์์ผ๋ฉฐ ์ซ์๋ ์ปค์คํ ํ์ ์ ์ธ์คํด์ค๋ ํฌํจ๋๋ฉฐ ํญ์ ๋๋ฌ ์ ์ค์ฒ๋ฅผ ์ธ์ํ๋ ๊ฒ๋ ์ด ์ด๋ฒคํธ์ ํฌํจ๋๋ค ์์์ ์ค์์น๊ฐ ๊ทธ๋์ ๊ฐ๋ฅํ ๊ฒ
RxSwift์์ ์ฌ์ฉ๋๋ ๋ง๋ธ ๋ค์ด์ด๊ทธ๋จ์ ์๋ ์ฌ์ดํธ์์ ์ฝ๊ฒ ํ์ธ ๊ฐ๋ฅํจ
-> ํ์ดํ๋ ์๊ฐ์ ๋ํ๋ด๊ณ ์ซ์๊ฐ ์ ํ ์๋ ๋๊ทธ๋ผ๋ฏธ๋ sequence๋ฅผ ๋ํ๋ ์ฌ๊ธฐ์ ์ํ์ค๋ ์์์ ๋งํ observable๋ฅผ ์๋ฏธํ๋ ๊ฒ์ผ๋ก ๋ณด๋ฉด ๋จ
์ฌ๊ธฐ์ 1์ด ๋ฐฉ์ถ๋๊ณ ์๊ฐ์ด ์กฐ๊ธ ํ๋ฅด๋ฉด 2๊ฐ ๋ฐฉ์ถ๋๊ณ ๊ทธ ๋ค์ 3, ๊ทธ ๋ค์ 4๊ฐ ๋ฐฉ์ถ๋๋ ๊ฒ์ ํ์ ๋ผ์ธ์ผ๋ก ํ์ ํด ๋ ๊ฒ!
Observable์ ์ด๋ฒคํธ์๋ ์ธ๊ฐ์ง๊ฐ ์๋๋ฐ
.next, .completed, .error ๊ฐ ์๋ค. ์ฌ๊ธฐ์ .completed ๋ฅผ ์ดํด๋ณด์๋ฉด
ํ์ดํ ๋ง์ง๋ง์ ์๋ ์ธ๋ก ๋ง๋๊ธฐ๋ observable์ ๋์ ์๋ฏธํจ
์ฌ๊ธฐ์ observable์ 4๊ฐ์ ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ๊ณ ๋๋จ ์ด๊ฒ์ completed ์ด๋ฒคํธ๋ผ๊ณ ํจ
์ด ํ์๋ผ์ธ์์ ์ํ์ค๋ ์ด๋ฏธ ํ๋ฉด์์ ์ฌ๋ผ์ ธ ๋ณด์ด์ง ์๋ dismiss ๋ ๋ทฐ์ ์กด์ฌํ๊ณ ์์ ์๋ ์๋ค! ์ด๋๋ ์ฌ์ฉํ์ง ์๋ ์ด๋ฒคํธ์ด๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋จ๊ฒจ๋ ํ์๊ฐ ์์ด ์ฆ์ ์ข ๋ฃ์ํค๋ ๊ฒ์ด ์ค์ํ๋ค. ๋ํ ์ด observable์ด ๋ ์ด์ ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ์ง๋ ์์ผ๋ฏ๋ก ์ ์์ ์ผ๋ก ์ข ๋ฃ์ํค๋ ๊ฒ์ด ํ์ํ๊ฒ ๋๋ค. ๋ง์ฝ์ ์ ์์ ์ผ๋ก ์ข ๋ฃ๊ฐ ์๋์์ ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด error ์ด๋ค
terminate ์ํฌ ์ ์๋ ์ด๋ฒคํธ๋ ๋ ๊ฐ์ง ์ธ๋ฐ ํ๋๋ completion์ด๊ณ ๋ค๋ฅธ ํ๋๋ error ์ธ ์ ์ด๋ค.
์๋ฌ ์ด๋ฒคํธ๋ ํ์ดํ ์ ์์์ x๋ก ํ์๋๋ค
์๋ฌ์ด๋ฒคํธ๊ฐ ๋ฐฉ์ถ๋๋ฉด ์ฆ์ observable์ ์ข ๋ฃ๋๊ณ ๋ ์ด์ ์๋ฌด๊ฒ๋ ๋ฐฉ์ถํ ์ ์๋ค
terminated์ด๋ฒคํธ๊ฐ ๋ฐฉ์ถ๋๋ฉด ๋ ์ด์ ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ ์ ์์!
์ด๋ ์ด๋ฒคํธ๊ฐ ์๋์ง๋ Pods์ RxSwift ์์ Event.swift <- ์ด ์์์ ํ์ธํ ์ ์๋ค
rxSwitch.rx.isOn
.subscribe { isOn in
print(isOn)
} onError: { error in
print(error.localizedDescription)
} onCompleted: {
print("completed")
} onDisposed: {
print("disposed")
}
error ํ์ ์ด Swift Error ํ์ ์ด๊ธฐ ๋๋ฌธ์ localizedDescription๋ก ์ฐ์ด ๋ณผ ์ ์์
์ด์ Observable์ ์์ฑํ๋ 'Operator'์ ๋ํด์ ์์๋ณด๊ฒ ์!
Observable.XXX() ์ ๊ฐ์ ๋ฉ์๋๋ฅผ RxSwift์์๋ Operator๋ผ๊ณ ํ๋ค! ๋ญ๊ฐ ์๋์ง ์ดํด ๋ณด๊ณ ์ถ๋ค๋ฉด cheat sheet๋ ์๋น!
https://cheatography.com/donghua-li/cheat-sheets/rxswift-operators/
์ฐ์ ํ๋์ ์์๋ฅผ ๋ด์ Observable sequence๋ฅผ ์์ฑํ๋ ์คํผ๋ ์ดํฐ๋ just ์ด๋ค!
let dog = 0
let cat = 1
let bird = 2
let animalObservable = Observable<Int>.just(dog)
์ด๋ ๊ฒ ์์ฑํด ์ค ์ ์๋ค. cheat sheet๋ฅผ ์ดํด๋ณด๋ฉด 'emit a particular item'์ด๋ผ๊ณ ์ ํ์๋๋ฐ ํน์ ํ ์์ดํ ์ ๋ฐฉ์ถํ๋ ์ต์ ๋ฒ๋ธ์ ์์ฑํ ์ ์๋ค!
๊ทธ ๋ค์ ์ดํด๋ณผ ๊ฒ์ of ์ธ๋ฐ ์ด๊ฒ์ just์ ๋ฌ๋ฆฌ ์ฌ๋ฌ ์์๋ฅผ ๋ด์ Observable ์ํ์ค๋ฅผ ์์ฑํ๋ค
let animalsObservable = Observable.of(dog, cat, bird)
์๋ก์ฝ๋กฌ ์์ฑํด ์ฃผ๋ฉด ๋๊ฒ ๋ค! ๋ง์ฝ์ of ์คํผ๋ ์ดํฐ์ ์ธ์๋ก ๋ค์ด๊ฐ dog, cat, bird ๊ฐ์ด Int ํ์ ์ด๋ฉด ์ต์ ๋ฒ๋ธ์ Element๋ int ํ์ ์ธ ๊ฒ! ๋ง์ฝ์ ํ๋ผ๋ฏธํฐ๋ก ํน์ ์ ๋ฌ๋๋ ๊ฐ์ ์ด๋ ์ด๋ก ์ฃผ๊ณ ์ถ๋ค๋ฉด
let animalsObservable = Observable.of([dog, cat, bird])
์ด๋ ๊ฒ ํด์ฃผ์ด์ผ ํ๋ค! ๊ทธ๋ ๋ค๋ฉด ๋ด๊ฐ ์ด๋ ์ด๋ก ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๊ฐ ์๊ณ ์ด ๋ฐ์ดํฐ๋ฅผ ํ๋ํ๋ ์ต์ ๋ฒ๋ก ๋ง๋ค๊ณ ์ถ๋ค! ํ ๋ ํ๋ํ๋ ํด์ค์ผ ํ ๊น? ๋ ธ๋ ์ด๋ฏธ from์ด๋ผ๋ ์คํผ๋ ์ดํฐ๊ฐ ์๋ค!
์์์ of๋ก ์์ฑํ ์ต์ ๋ฒ์ ๋ฐํ ๊ฐ์ ๋ณด๋ฉด
int ์ด๋ ์์ ์ ์ ์๋ค! ์ฆ ์์ฑํ ๊ฒ์ [Int] ํ์ ์ ์ต์ ๋ฒ!
let animalsObservable = Observable.of([dog, cat, bird])
let animalObservables = Observable.from([dog, cat, bird])
๊ทธ๋ฐ๋ฐ ๋ง์ฝ from์ผ๋ก ์์ฑํ๋ค? (์์๋ of, ๋ฐ์๋ from)
๊ทธ๋ฌ๋ฉด ๊ฒฐ๊ณผ ๊ฐ์
์ด๋ฌํ๋ค! Int ํ์ ์ ์ต์ ๋ฒ๊ฐ ์์ฑ๋ ๊ฒ์ ์ ์ ์๋๋ฐ enumerable ์ํ์ค๋ฅผ ์ธ์๋ก ๋ฐ์์ ์ด๋ ์ด๋ฅผ ์ต์ ๋ฒ๋ก ์์ฑํ๋ค. from ์ ๋ฌด์กฐ๊ฑด ํ๋ผ๋ฏธํฐ๋ก ์ด๋ ์ด ํ์ ์ ๋ฐ๋๋ค!
์ ๋ฆฌ>>>
of ์์ Element๊ฐ [Int] ์ด๋ฉด ๊ฒฐ๊ณผ๋ Observable<[Int]>
from ์์ Element๊ฐ [Int] ์ด๋ฉด ๊ฒฐ๊ณผ๋ Observable<Int>
์ฌ์ค ์ ์ดํด ์๋๋๊ฒ ์ด๋ ์ด๋ฅผ ๋ฃ์๋๋ฐ ๊ฒฐ๊ณผ๊ฐ ์ด๋ป๊ฒ ํ๊ฐ ๋์ค๋ ๊ฑด์ง ์ ๊ธฐํ๋น ์ด๋ฐ๊ฑด ๋ค๋ฅธ๊ฑฐ ๋ณด๋ฉด์ ์ตํ๋ค๊ฐ ๋์ค์ ์ด! ํ๋ฉด์ ์๊ฒ๋๋ ๊ฒ์ด ์ต๊ณ ์
๊ทธ๋ฐ๋ฐ ๋น๋ํด๋ณด๋ฉด ์๋ฌด๊ฒ๋ ๋์ค์ง ์๋๋ค! why? ๋ฐ๋ก ๊ตฌ๋ ์ ์ํ๊ธฐ ๋๋ฌธ!
Observable์ ์ด๋ฆ ๊ทธ๋๋ก ์ต์ ๋น ๊ฐ๋ฅํ ์น๊ตฌ์ธ๋ฐ ์ด ์น๊ตฌ์ ๊ฐ์ ๋ฐ์๋ณด๊ณ ์ถ์ผ๋ฉด ๊ตฌ๋ ํด์ค์ผ ํจ! ์ ํ๋ธ๋ ๋น์ทํ ๊ฑด๊ฐ ๋ณด๋ค. ์ ํ๋ฒ๊ฐ Observable์ด๊ณ ์ฌ๊ธฐ ์ ๋์์์ด ์ฌ๋ผ์ค๋ฉด Element์ธ๊ฑฐ๊ณ ์ด๊ฑฐ์ ๋ํ ์๋ฆผ์ ๋ฐ๊ณ ์ถ๋ค ๊ทธ๋ฌ๋ฉด ๊ตฌ๋ ์ข์์ ์๋ฆผ ์ค์ ํด์ฃผ๋ ๊ฑด๊ฐ๋ณด๋น ์์๊ฐ ์ ํํ์ง ์์ ์ ์์ง๋ง...
Subscribing
์ฐ์ ์ด์ ์ observable์์ ์ค์ํ๊ฒ ์๊ฐํด์ผ ํ ๋ถ๋ถ์ observable ์ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ด์ง ์๋๋ค๋ ๊ฒ์ด๋ค! ๋ง๊ทธ๋๋ก ์ต์ ๋ฒ๋ง ์์ฑํด ๋์ ์ํ! ์ด์ ์ฌ๊ธฐ์ ์ด ์ต์ ๋ฒ๋ฅผ ๊ตฌ๋ ํ๋ subscriber๊ฐ ์๊ฒจ์ผ ์ด๋ฒคํธ๋ฅผ send! ํ๊ฒ ๋๋ ๊ฒ
์ค์ํ ์ฌํญ์ Observable์ ์ํ์ค๋ผ๋ ๊ฒ์ด๋ค. observable์ ๊ตฌ๋ ํ๋ค(subscribing) ๋ ๊ฒ์ Swift Standard library ์์ interator์ next()๋ฅผ ํธ์ถํ๋ ๊ฒ๊ณผ ๊ฐ๋ค
let dog = "๋ฉ๋ฉ"
let cat = "์ผ์น"
let bird = "์ท์ท"
let animalSoundObservable = Observable.of(dog, cat, bird)
of ๋ก Event<String> ์ต์ ๋ฒ๋ธ์ ์์ฑํด ์ค๋ค! subscribe๋ฅผ ๋ณด๋ฉด
์ด๋ ๊ฒ ๋์ด ์๋น ํ๋ผ๋ฏธํฐ๋ก Event<String>์ ๋๊ฒจ์ฃผ๊ณ Disposable์ ๋ฐํ ๋ฐ์ ์ ์๋ค
dispose ํด์ฃผ์ง ์์๋ ์ฝ์์ completed๊ฐ ์ฐํ๋ ๊ฒ์ ๋ณผ ์ ์๋น ๊ทธ๋๋ ๋ ธ๋์ค ์ง์ ์ฃผ๋ ค๊ณ ์์ง ์ ๋ชจ๋ฅด๋ DisposeBag()๋ก ์ต์ ๋ฒ๋ฅผ ์ข ๋ฃ์ํค๋๋ก ํด์ฃผ์๋ค
let disposebag = DisposeBag()
animalSoundObservable.subscribe { event in
print(event)
}.disposed(by: disposebag)
๊ทธ๋ฌ๋ฉด ์ด์ ์ต์ ๋ฒ์ ๊ฐ ์์๋ฅผ ์ฝ์์ ํ๋ฆฐํธ ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์์์ ์ดํด ๋ดค๋ฏ์ด ์ธ๊ฐ์ง ์ด๋ฒคํธ๊ฐ ์๋๋ฐ (.next, .completed, .error)
์ต์ ๋ฒ๋ธ์ด .next ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ๋ ๊ฒ์ ์ ์ ์๋ค. ์ฌ๊ธฐ์ .completed ์ด๋ฒคํธ๊ฐ ๋ฐฉ์ถ๋๊ณ ์ฆ์ ํด๋น ์ํ์ค๋ ์ข ๋ฃ ๋๋ ๊ฒ!
๊ทธ๋ ๋ค๋ฉด ์ฌ๊ธฐ์ of์ from์ ์ฐจ์ด๋ฅผ ํ ์คํธ ํด๋ณผ ์ ์๋น
์ด๋ ์ด๊ฐ ์๋ ๊ฐ ์์๋ฅผ ๋ฃ์ด์ค of ์คํผ๋ ์ดํฐ๋ ๋ดค์ผ๋ of์ ํ๋ผ๋ฏธํฐ๋ก ์ด๋ ์ด๋ฅผ ๋ณด๋ด ์ฃผ๋ฉด
next(["๋ฉ๋ฉ", "์ผ์น", "์ท์ท"])
completed
๊ฐ ์ฐํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ฆ next๋ ํ๋ฒ๋ง ๋ฐฉ์ถ (์ด๋ ์ด ์ ์ฒด์ ๋ํด) ๊ทธ ํ completed ์ด๋ฒคํธ ๋ฐฉ์ถ
๋์๋ค๋ ๊ฒ ์ด์ from์ ์ฐ์ด๋ณด๋ฉด
next(๋ฉ๋ฉ)
next(์ผ์น)
next(์ท์ท)
completed
of ์คํผ๋ ์ดํฐ์ ์์๋ฅผ ๊ฐ๊ฐ ์ ์ด์ค ๊ฒ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค!
์์ง subscribe๋ฅผ ๋ค ๋ณด์ง ๋ชปํด์ ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ช ๊ฐ์ธ์ง ๋ด์ฉ๋ฌผ์ด ๋ญ์ง ์์ง ๋ชปํ๋ ์ด๋ ์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ค! ํ์ ๋ง ์๋ค ํ๋ฉด from์ ์ฐ๋ฉด ๋๊ฒ ๊ณ ๊ฐ๊ฐ์ ๊ตฌ์ฑ์์๋ฅผ ์๊ณ ๋ช๊ฐ ์๋๋ค ํ๋ฉด of๋ฅผ ์ฐ๋ฉด ๋๊ฒ ๋ค ์ถ๋ค.
next()๋ก ์ฐํ๋ ๊ฒ์ ์ด๋ฒคํธ๋ฅผ ํ๋ฆฐํธ ํด์ ๊ทธ๋ ๊ณ ๊ฐ์ ํ๋ฆฐํธ ํ๊ณ ์ถ๋ค๋ฉด next ์ด๋ฒคํธ์ element๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค
ex> event.element
์ด๋ฒคํธ๊ฐ ์๋ ์ด๋ฒคํธ์ ๊ฐ์ ๋ฐ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด onNext๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค!
Event<Element>๊ฐ ์๋ Element๋ฅผ ํด๋ก์ ์ ๊ฐ์ผ๋ก ๋ฐ์ ์ ์๋ค
animalSoundObservable.subscribe(onNext: { element in
print(element)
})
์ฝ์์ ๋ณด๋ฉด ์ ์ ์์ง๋ง completed ๊ฐ ๋๋ ๊ฒ์ ์ ์ ์๋ค. ์ ๋ ์ข ๋ฃ๋์ง ์์์ผ ํ๋ ๊ฒฝ์ฐ ์ฆ completed, error ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์์์ผ ํ๋ ๊ฒฝ์ฐ never ์คํผ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค
์ด๋ ํ ์์ดํ ๋ ๋ฐฉ์ถํ์ง ์๊ณ ์ ๋ ์ข ๋ฃ๋์ง๋ ์๋ ์ต์ ๋ฒ๋ธ์ ์์ฑํ ์ ์๋ค.
let neverObservable = Observable<Any>.never()
neverObservable.subscribe(onNext: { element in
print(element)
}, onCompleted: {
print("never observable completed") // ์ถ๋ ฅ์๋จ
})
onCompleted ๊ตฌ๋ฌธ์ ์ ์ ๋ฌธ๊ตฌ๊ฐ ์ถ๋ ฅ๋์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ never ์คํผ๋ ์ดํฐ๋ ์ข ๋ฃ๋์ง ์๋ ์ต์ ๋ฒ๋ธ์ ์์ฑํ๊ธฐ ๋๋ฌธ! ๊ทธ๋ฆฌ๊ณ ์ด๋ ํ element๋ ์๋ค
๊ทธ๋ ๋ค๋ฉด ๋ฐฉ์ถ๋๋ element๋ ์์ง๋ง ์ฆ์ ์ข ๋ฃ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ์๋ empty ์คํผ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค! ์ด๋์ ์ฐ์ด๋์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์
let emptyObservable = Observable<Void>.empty()
emptyObservable.subscribe(onNext: { event in
print(event)
}, onCompleted: {
print("completed")
}).disposed(by: disposebag)
์ฆ์ ์ข ๋ฃ๋์ด ์ฝ์์ completed๊ฐ ์ฐํ๋ ๊ฒ์ ํ์ธํ ์์๋น
(๊ถ๊ธํ๊ฑด ๋ฐํ๋๋ element๊ฐ ์๋ค๊ณ ํ๋๋ฐ ์ด๊ฒ์ด nil์ ์๋ฏธํ๋๊ฒ ์๋๋ผ ์์ ํ ๋ฌด์ ์ํ๋ฅผ ์๋ฏธํ๋ ๊ฑฐ๊ฒ ์ง?? )
range๋ for๋ฌธ ์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅํ๋น
let rangeObservable = Observable<Int>.range(start: 1, count: 10)
rangeObservable.subscribe(onNext: { i in
print("ํ์ฌ ๊ฐ์? : \(i)")
})
์ฐธ๊ณ ๋์ : RxSwift reactive programming with swift - raywenderlich
๋ฌธ์ ์ ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
๊ณต๋ถํ๋ฉด์ ์ ๋ค๋ณด๋ ํ๋ฆฐ ๋ด์ฉ์ด ์์ ์ ์์ต๋๋ค ใ ใ
'๐ iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[RxSwift] Traits ์ side effect & Subject ๊ธฐ๋ณธ (0) | 2022.01.07 |
---|---|
[RxSwift] DisposeBag ๊ณผ Operator (0) | 2022.01.06 |
[iOS/Swift] Custom Font ์ฌ์ฉํ๊ธฐ (0) | 2021.12.19 |
[Swift] RIBs Architecture ๊ฐ์์ ํ ํ๋ฆฟ ์ค์ (0) | 2021.11.12 |
[Swift] push notification ์ ๋ฆฌ (with Firebase) permission๊ณผ ํธ์ ๋ฐ์ ๋ ํธ์ถ๋๋ ํจ์ (0) | 2021.10.27 |
๋๊ธ