Udemy에서 Mastering RxSwift in iOS 수업을 듣고 난 후 정리한 글입니다.
수업을 위해 RxSwift, RxCocoa, RxDataSources
# Pods for HelloRxSwift
pod 'RxCocoa'
pod 'RxDataSources'
pod 'RxSwift'
Observable.of(1, 2, 3, 4)와 Observable.from([1, 2, 3, 4])는 같다고 보면 된다.
let observable1 = Observable.just(1)
let observable2 = Observable.of(1, 2)
let observable3 = Observable.of([1, 2, 3])
let observable4 = Observable.from([1, 2, 3, 4])
4를 구독하고 이벤트를 출력하면 다음과 같이 나온다.
observable4.subscribe { event in
print(event)
}
출력: next(1)
출력: next(2)
출력: next(3)
출력: next(4)
출력: completed
이벤트에서 숫자를 출력하려면 다음과 같이 한다.
observable4.subscribe { event in
if let element = event.element {
print(element)
}
}
4와 다르게 3은 배열 전체를 관찰하므로 다음과 같이 출력된다.
observable3.subscribe { event in
if let element = event.element {
print(element)
}
}
출력: [1, 2, 3]
if문으로 언랩핑하는 방법 말고 다른 방법이 있다.
observable4.subscribe(onNext: { element in
print(element)
})
구독을 새롭게 변수에 할당하고, 변수를 dispose를 하는 방법이 있다. 메모리 누수를 방지한다.
let subscription4 = observable4.subscribe(onNext: { element in
print(element)
})
subscription4.dispose()
위와 같이 관찰자를 생성하고 구독을 정의해 취소하는 방법도 있다. 그러나 한번에 할 수도 있다.
아래와 같이 "A", "B", "C"를 관찰하고 구독한다. 그리고 disposeBag을 통해 취소할 수 있다.
let disposeBag = DisposeBag()
Observable.of("A", "B", "C").subscribe {
print($0)
}.disposed(by: disposeBag)
element를 직접 추가하고 구독하고 버리는 방법이 있다.
A 이후에 관찰자가 끝났기 때문에 onCompleted → onDisposed가 실행된다.
private extension ViewController {
func createAndDispose() {
Observable.of("A", "B", "C").subscribe {
print($0)
}.disposed(by: disposeBag)
Observable<String>.create { observer in
observer.onNext("A")
observer.onNext("B")
observer.onCompleted() // 완료. onCompleted -> onDisposed
observer.onNext("?") // 실행 X
return Disposables.create()
}.subscribe(
onNext: { print($0) },
onError: { print($0) },
onCompleted: { print("Completed") },
onDisposed: { print("disposed") })
.disposed(by: disposeBag)
}
}
출력: A
출력: Completed
출력: disposed
import UIKit
import RxSwift
class ViewController: UIViewController {
let observable1 = Observable.just(1)
let observable2 = Observable.of(1, 2)
let observable3 = Observable.of([1, 2, 3])
let observable4 = Observable.from([1, 2, 3, 4])
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
subscribeNumbers()
createAndDispose()
}
}
private extension ViewController {
func createAndDispose() {
Observable.of("A", "B", "C").subscribe {
print($0)
}.disposed(by: disposeBag)
Observable<String>.create { observer in
observer.onNext("A")
observer.onCompleted() // 완료. onCompleted -> onDisposed
observer.onNext("?") // 실행 X
return Disposables.create()
}.subscribe(
onNext: { print($0) },
onError: { print($0) },
onCompleted: { print("Completed") },
onDisposed: { print("disposed") })
.disposed(by: disposeBag)
}
func subscribeNumbers() {
observable4.subscribe { event in
if let element = event.element {
print(element) // 1, 2, 3, 4
}
}
observable3.subscribe { event in
if let element = event.element {
print(element) // [1, 2, 3]
}
}
// disposeBag없이 dispose하기
let subscription4 = observable4.subscribe(onNext: { element in
print(element) // 1, 2, 3, 4
})
subscription4.dispose()
}
}