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
'Swift > RxSwift' 카테고리의 다른 글
RxSwift Subject의 Observable 역할 (1) | 2024.09.03 |
---|---|
RxSwift Observable 생성 (empty, never, range, interval, timer, defer) (0) | 2024.08.26 |
RxSwift Observable생성 (just, of, from, create) (0) | 2024.08.25 |
RxSwift 개념 (0) | 2024.08.25 |