Reactive Programming 은 반응형 프로그래밍이라고도 하며, 현재 가장핫(?) 한 기술중 하나이다.
검색하면 정말 좋은 자료들이 많지만 저도 숟가락 하나 얹어 보겠습니다.
그래서 Reactive Programming 이 무엇이냐?
ReactiveX에서 observer는 observable 을 구독한다. observer는 observable이 방출하는 모든 아이템(들)에 대해 반응한다.
비동기 프로그래밍을 더욱 쉽게 개발 하기 위한 라이브러리이며
기존 명령형 프로그래밍이 아닌 선언형 프로그래밍으로 개발이 가능하다.
값이나 오브젝트 의 대한 내용을 구독 함으로써 값의 변화에 대응 할수가 있다.
Observable
- 옵저버블 (Observable) 이란 데이터 스트림을 생성하는 객체를 말한다.
- 옵저버(Observer)는 데이터 스트림을 구독하여 사용하는 객체를 를 말한다.
Just
- 가장 기본적인 옵저버블이다.
- 한개의 입력을 받고 그대로 방출 한다.
Observable.just("스터디")
.subscribe(onNext : {
data in
print("\(data)")
}).disposed(by: disposeBag)
From
- 배열의 값을 받아 배열의 갯수만큼 방출하는 옵져버블
Observable.from([1,"Rxswift",2,"스터디"])
.subscribe(onNext : {
data in
print("\(data)")
}).disposed(by: disposeBag)
Zip
- 2개이상의 옵져버블, 서브젝트를 받아 하나의 옵져버블로 결합해서 방출한다.
* 결합할려는 있는 옵져버블 에 값이 들어와야 해당 내용을 방출한다.
var firstSubject = PublishSubject<String>()
var secondSubject = PublishSubject<String>()
Observable.zip(firstSubject, secondSubject)
.asObservable()
.subscribe(onNext : {
first, second in
print("first : \(first)")
print("second : \(second)")
print("-------------------")
}).disposed(by: disposeBag)
for i in 0...3
{
firstSubject.onNext("첫번째 값 : \(i)")
}
for j in 0...3
{
secondSubject.onNext("두번째 값 : \(j)")
}
CombineLatest
- 2개이상의 옵져버블, 서브젝트를 받아 하나의 옵져버블로 결합해서 방출한다.
* 짝(!?) 을 이루고있는 옵져버블에 대한 최신 값에 대해 방출한다.
var firstSubject = PublishSubject<String>()
var secondSubject = PublishSubject<String>()
Observable.combineLatest(firstSubject, secondSubject)
.asObservable().subscribe(onNext : {
first, second in
print("first : \(first)")
print("second : \(second)")
print("-------------------")
}).disposed(by: disposeBag)
for i in 0...3
{
firstSubject.onNext("첫번째 값 : \(i)")
}
for j in 0...2
{
secondSubject.onNext("두번째 값 : \(j)")
}
Subject
- 옵저버블과 옵저버 역할을 두개다 수행할수 있는 타입
PublishSubject
- subscribe 이전 데이터에 대해 전달한다.
- 초기값은 없으며 onNext 시에 데이터를 발행 한다.
해당 ViewController 상에서 TimerViewController 에 있는 Subject를 구독 받아놓는다.
TimerViewController.textObservable
.asObserver()
.subscribe(onNext : {
data in
print(data)
}).disposed(by: disposeBag)
구독을 받아 놓은 상태에서 2초뒤에 해당 타이머 작동이라는 값을 발행하면 구독한 옵저버에서 받을수 있다.
static var timerObservable = PublishSubject<String>()
override func viewDidLoad()
{
super.viewDidLoad()
timer()
}
func timer()
{
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0)
{
TimerViewController.timerObservable.onNext("타이머 작동")
}
}
BehaviorSubject
- 초기값을 가지고 있는 Subject
- subscribe 하자마자 초기값을 방출받고 그 이후로 onNext 하는 값을 받는다
TimerViewController.textObservable
.asObserver()
.subscribe(onNext : {
data in
print(data)
}).disposed(by: disposeBag)
구독과 동시에 초기값을 발행 받고 2초뒤에 따로 발행한 값을 받는다.
static var textObservable = BehaviorSubject<String>(value: "첫번째값")
override func viewDidLoad()
{
super.viewDidLoad()
timer()
}
func timer()
{
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0)
{
TimerViewController.textObservable.onNext("두번째값")
}
}
Observable VS Subject
Observable | Subject |
그냥 단지 함수이다. State 존재 X | state를 가진다. data를 메모리에 저장 |
각각 옵저버에 대해 코드가 실행 | 같은 코드 실행. 모든 옵저버에 대해 오직 한번만 |
오직 옵저버블만 생성 | 옵저버블 생성 및 그것을 관찰 할수가 있음 |
용도 : 하나의 옵저버에 대한 간단한 Observable이 필요할때 | 용도 : 자주 데이터를 저장하고 수정할때 여러개의 옵저버가 데이터를 관찰 해야할때 옵저버와 옵저버블 사이의 연결 다리 역할 |
참고 : http://reactivex.io/
https://github.com/ReactiveX/RxSwift
https://sujinnaljin.medium.com/rxswift-subject-99b401e5d2e5
'IOS' 카테고리의 다른 글
Swift - UITableView + ListClick (0) | 2021.08.13 |
---|---|
Swift - Property Wrapper (0) | 2021.08.06 |
Swift - ReactorKit / ErrorHandling (0) | 2021.07.24 |
Swift - iOS 면접 질문 리스트 (0) | 2021.07.18 |
Swift - UICollectionView + Paging (0) | 2021.07.13 |