24.08.23 Today I Learned
RxSwift란?
ReactiveX는 옵저버블 스트림으로 비동기 프로그래밍을 돕는 API
-> ReactiveX는 비동기 프로그래밍과 옵저버 패턴을 사용하기 쉽도록 돕는 라이브러리입니다. 데이터의 변화에 반응하는 프로그래밍을 하게되어 반응형 프로그래밍이라고도 합니다. ReactiveX를 Swift에 적용한 것이 RxSwift입니다.
RxSwift vs Combine
Combine은 iOS 13 이상부터 지원하는 라이브러리로, 비교적 출시된지 얼마안된 기술입니다. 따라서 아직 발전 중에 있는 기술이며, 관련 자료가 RxSwift보다 적은편입니다.
RxSwift는 ReactiveX의 프로그래밍 철학을 따르기 대문에, 같은 철학을 따르는 RxJava, RxPython, RxJS 등 다른 언어를 사용하는 개발자들과 원활한 대화를 할 수 있습니다.
또 현실적으로 현재 이미 많은 기업들의 코드는 RxSwift로 작성된 상태로 동작을 하고 있습니다. 새로운 피쳐 개발이나 신생 스타트업이 아니라면 RxSwift 사용 비율이 Combine보다 높기 때문에 이러한 여러 관점에서 RxSwift를 먼저 공부하는 것이 괜찮은 선택이 됩니다.
또한, RxSwift를 이해한다면 Combine의 이해는 매우 쉽기 때문에 RxSwift를 먼저 공부하는걸 추천합니다.
Observable 개념
Observable은 관측 가능한 대상이며, 이벤트와 데이터를 방출하는 클래스입니다.
Observable에서 이벤트를 방출하면, 이를 구독하고 있던 구독자(관찰자)들이 그에 반응하며 어떠한 로직을 수행합니다.
Observable을 구독하는 것을 subscribe이라고 하며, 이를 구독하는 관찰자를 Observer라고 합니다.
예를들어, Observable을 구독하고 있는 구독자가 "나는 Observable에서 정수 값이 방출되어 나오면, 그 값에 2를 곱해서 사용할래" 라는 세팅을 해두면, Observable에서 3이라는 값이 나왔을 때 Observer는 6이라는 값을 사용하게 되는 것입니다.
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
'Today I Learned > 2024' 카테고리의 다른 글
24.09.02 Today I Learned (0) | 2024.09.02 |
---|---|
24.08.26 Today I Learned (0) | 2024.08.26 |
24.08.20 Today I Learned (0) | 2024.08.20 |
24.08.19 Today I Learned (0) | 2024.08.19 |
24.08.08 Today I Learned (0) | 2024.08.08 |