반응형
Notice
Recent Posts
Recent Comments
Link
- Today
- Total
07-07 21:40
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
Tags
- decode
- grep
- r
- delegate
- cocoapods
- barplot
- deeplearning
- MVC
- tapply
- trunc
- struct
- rxswift
- Observable
- Python
- Optional
- 명령어
- SWIFT
- sigmoid
- ReLU
- substr
- ios
- Linux
- 시각화
- Upper
- swiftUI
- SQL
- 딥러닝
- NVL
- scheduledTimer
- 연산자
Archives
iOS 개발 기록 블로그
iOS(RxSwift) Subject 종류와 예시 코드 본문
반응형
Observable이라는 신문을 구독하고 있는 구독자(Subscriber)이 있다고 생각한다.
Subject는 Observable에 흐르는 event를 받아 구독자에게 전달한다고 보면 된다.
종류
- Publish Subject
- Behavior Subject
- Replay Subject
- Variable
- BehaviorRelay
PublishSubject
let subject = PublishSubject<String>()
subject.onNext("Issue 1")
subject.subscribe { event in
print(event)
}
subject.onNext("Issue 2")
subject.onNext("Issue 3")
subject.dispose()
//subject.onCompleted()
subject.onNext("Issue 4")
//next(Issue 2)
//next(Issue 3)
subject를 구독하고 난 뒤에 onNext만 흘러들어오며
dispose(즉, 구독취소)하고 난 뒤에 onNext는 당연히 넘어오지 않는다.
dispose가 아니고 onCompleted()를 해줘도 마찬가지로 Issue 4는 넘어오지 않는다.
BehaviorSubject
let subject = BehaviorSubject(value: "Initial Value")
subject.onNext("Last Issue 1")
subject.onNext("Last Issue 2")
subject.subscribe { event in
print(event)
}
subject.onNext("Issue 1")
//next(Last Issue 2)
//next(Issue 1)
데이터를 갖고 있다가 (초기화할 때 받았던 데이터 든, 그 이후에 onNext로 받은 데이터 든)
마지막에 갖고 있는 데이터(마블) 하나를 구독하는 순간 흘려 보내준다.
💡
초기화할 때 꼭 변수를 할당해줘야 한다.
ReplaySubject
// need to have bufferSize
let subject = ReplaySubject<String>.create(bufferSize: 2)
subject.onNext("Issue 1")
subject.onNext("Issue 2")
subject.onNext("Issue 3")
print("--- 1st Subscription ---")
subject.subscribe { val in
print(val)
}
subject.onNext("Issue 4")
subject.onNext("Issue 5")
subject.onNext("Issue 6")
print("\n--- 2nd Subscription ---")
subject.subscribe { val in
print(val)
}
print("\n--- After 2nd Subscribing, onNext event ---")
subject.onNext("Issue 7")
subject.onNext("Issue 8")
//--- 1st Subscription ---
//next(Issue 2)
//next(Issue 3)
//next(Issue 4)
//next(Issue 5)
//next(Issue 6)
//
//--- 2nd Subscription ---
//next(Issue 5)
//next(Issue 6)
//
//--- After 2nd Subscribing, onNext event ---
//next(Issue 7)
//next(Issue 7)
//next(Issue 8)
//next(Issue 8)
bufferSize가 2인 경우 마지막 2개의 데이터(마블)을 받아온다.
첫번째 구독하는 순간 이슈 2와 이슈 3을 받아왔고 이후에 onNext로 데이터가 계속 넘어오다가
새로운 두번째 구독하는 순간 이슈 5와 이슈 6를 흘려보낸다.
두번째 구독 이후에 onNext 이벤트는 구독자가 둘이니까 2개 씩 print된다.
Variables
let variable = Variable([String]())
variable.value.append("Item 1")
variable.asObservable()
.subscribe { val in
print(val)
}
variable.value.append("Item 2")
//ℹ️ [DEPRECATED] `Variable` is planned for future deprecation. Please consider `BehaviorRelay` as a replacement. Read more at: https://git.io/vNqvx
//next(["Item 1"])
//next(["Item 1", "Item 2"])
Variable은 BehaviorRelay로 대체되었다.
BehaviorRelay
💡
BehaviorRelay는 RxCocoa를 설치해야 한다.
import UIKit
import RxSwift
import RxCocoa
let disposeBag = DisposeBag()
let relay = BehaviorRelay(value: ["Item 1"])
var value = relay.value
value.append("Item 2")
value.append("Item 3")
relay.accept(value)
relay.asObservable()
.subscribe { val in
print(val)
}
//next(["Item 1", "Item 2", "Item 3"])
코드로 형태와 특징을 이해해본다.
Reference
Mastering RxSwift for iOS Reactive Programming for Developers
Reactive Programming Using Swift Programming Language
www.udemy.com
반응형
'iOS > RxSwift' 카테고리의 다른 글
iOS(RxSwift) Subscribe with example (0) | 2022.08.30 |
---|---|
iOS(RxSwift) Observable 개념과 예시 (0) | 2022.08.29 |
iOS(RxSwift) Install RxSwift using CocoaPods (0) | 2022.08.28 |
iOS(Swift) Reactive Programming (RxSwift) 란? (0) | 2022.08.27 |
iOS(Swift) Functional Programming(함수형 프로그램) 이란? (0) | 2022.08.26 |