곰튀김 님의 RxSwift 4시간에 끝내기 (종합편) 영상을 보고 작성한 글입니다 ^~^
정말 생초보,, 아무것도 모르는 입장에서 강의 영상을 보고 의식의 흐름대로 작성한 글이니 비판의 눈으로 글을 읽어 주시면 감사하겠습니다~~ 오류 지적 대환영!
Subject
- Observable 밖에서 값을 받아 와서 컨트롤할 수 있음
- 종류 4개(docs 참고)
- AsyncSubject
-
- Subcribe가 아무리 많이 들어와도 Complete 시점에 가장 마지막 데이터만 모두에게 내려 줌
- BehaviorSubject
-
- 기본값 하나 가지고 시작, 누군가가 Subscribe하면 기본값을 내려 줌
- 중간에 새롭게 Subscirbe가 들어오면 기본값으로 가장 최근의 값을 내려 줌
- PublishSubject
-
- Subscribe가 들어오면 그대로 데이터를 내려 줌
- 중간에 새롭게 Subscribe가 들어와도 그 중간부터 그대로 내려 줌
- ReplaySubject
-
- 처음부터 Subscribe하면 PublishSubject와 똑같이 데이터 내려 줌
- 중간에 Subscribe가 들어오면 그동안의 데이터들을 한번에 Replay하여 내려 줌
Sugar API
.scan
- 계산된 값을 계속 누적시킴
[Scan]
— Observable이 배출한 항목에 연속적으로 함수를 적용하고 실행한 후 성공적으로 실행된 함수의 리턴 값을 발행한다초기값
-1번
연산하여 리턴(A
),A
-2번
연산하여 리턴(B
),B
-3번
연산하여 리턴(C
),C
-4번
연산하여 리턴(D
) ...- 초기값과 연산
.scan
에 들어올 첫 번째 값은 초기값과 연산됨!
Observable.of(1, 2, 3) // 만약 1, 2, 3이 연속으로 들어온다면
.scan(0) { (prevValue, newValue) in // 초기값을 0으로!
return prevValue + newValue
}
.subscribe(onNext: { print($0) })
// 결과
1 // (초기값 0 + 1)
3 // (기존값 1 + 2)
6 // (기존값 3 + 3)
RxCocoa
- Rx를 활용한 UIKit의 Extension 제공
- Sugar API
.bind
순환 참조 없이 사용 가능( .subscribe와 동일)- .bind (2:25:25~)
- UIKit요소.rx.~ 했을 때 나오는 값이
Binder
면 바인드를 시킬 수 있음 - Subscirbe를 하지 않고 bind해서 사용
-
.map { "\($0)" } .bind(to: itemCountLabel.rx.text) .disposed(by: disposeBag)
-
.subscribe(onNext: [weak self] { self.itemCountLabel.text = $0 }) .disposed(by: disposeBag)
- 위의 두 코드가 같은 동작!
- 장점:
[weak self]
같은 순환 참조 방지를 안 해도 됨 - 위 코드처럼 UI를 바꾸는 작업을 진행하려면 메인 스케줄러에서 동작시켜야 함!
-
.map { "\($0)" } .observeOn(MainScheduler.instance) .bind(to: itemCountLabel.rx.text) .disposed(by: disposeBag)