https://velog.io/@tjrqja07/posts?tag=rxswift
이전에 강의 보면서 정리해논 내용에 이번에 새로 강의를 들으면서 추가적인 정리를 해보자...
1. Observable.create()
: Observable을 생성하는 가장 기본적인 방법
import Foundation
import RxSwift
// 예시 에러 선언.
struct MyError: Error {}
// 구독 해제를 위한 DisposeBag 선언.
// 구독을 하고 나선 구독 해제를 반드시 해줘야 합니다.
let disposeBag = DisposeBag()
// observable 생성.
// create 클로저 안에 방출할 데이터를 선언합니다.
let observable = Observable<String>.create { observer in
// 정상적인 데이터 방출.
observer.onNext("Apple")
observer.onNext("Banana")
observer.onNext("Cake")
// 에러 방출. 에러가 방출되면 스트림이 종료됩니다.
observer.onError(MyError())
// Disposables.create 를 리턴해줌으로써 Observable 생성 완료.
return Disposables.create()
}
// 구독 (subscribe).
// 각 상태에 따라서 스트림이 흘렀을 때 어떤 행동을 취할 것인지 정의합니다.
observable.subscribe(onNext: { data in
print("onNext: \(data)")
}, onError: { error in
print("onError: \(error)")
}, onCompleted: {
print("onCompleted")
}, onDisposed: {
print("onDisposed")
}).disposed(by: disposeBag)
2. Observable.just()
: 간단하게 단일 데이터를 방출하는 Observable을 생성할 때
// 단일 데이터를 방출하는 just 활용.
let observable2 = Observable.just("Adam")
// 간단하게 onNext 만 선언할 수도 있습니다.
observable2.subscribe(onNext: { data in
print("onNext: \(data)")
}).disposed(by: disposeBag)
3. Observable.of()
: 여러 개의 데이터를 방출하는 Observable을 생성할 때
// 복수 데이터를 방출하는 of 활용.
let observable3 = Observable.of("red", "blue", "yellow")
observable3.subscribe(onNext: { data in
print("onNext: \(data)")
}).disposed(by: disposeBag)
4. Observable.from()
: 배열에서 각 요소를 순차적으로 방출하는 Observable을 생성할 때
// 배열로 부터 데이터를 방출하는 from 활용.
let observable4 = Observable.from([1, 2, 3, 4, 5])
observable4.subscribe(onNext: { data in
print("onNext: \(data)")
}).disposed(by: disposeBag)
5. Observable.interval()
: 일정한 시간 주기로 데이터를 방출하는 Observable을 생성할 때
// Scheduler 는 쓰레드 지정을 의미. Xcode Command Line Tools 에서는
// Main Thread 의 개념이 없기 때문에 임의의 Scheduler 생성.
let scheduler = SerialDispatchQueueScheduler(qos: .default)
// 1초마다 증가하는 Int 값을 방출하는 Observable 생성.
// take(5) 는 Observable 에서 방출하는 데이터 중 처음 5개까지만 받겠다는 operator.
let observable5 = Observable<Int>.interval(.seconds(1), scheduler: scheduler)
.take(5)
observable5.subscribe { event in
print(event)
}.disposed(by: disposeBag)
// input 이 들어오기 전까지 Xcode Command Line Tools 가 종료되지 않도록 하기위해 선언.
let input = readLine()
Trait
은 Observable 중에서도 특별한 상황에 맞게 제공되는 Observable을 말함onSuccess
: Observable 의 onNext
와 같은 개념.onFailure
: Observable 의 onError
와 같은 개념.onCompleted
는 존재하지 않습니다.Maybe
라고 합니다. “아마도 값이 있을 수도 있고 없을 수도 있어요” 로 이해하시면 됩니다.onSuccess
: Observable 의 onNext
와 같은 개념.onError
: Observable 의 onError
와 같은 개념.onCompleted
: Observable 의 onCompleted 와 같은 개념.Completable
을 사용합니다.onCompleted
: Observable 의 onCompleted 와 같은 개념.onError
: Observable 의 onError
와 같은 개념.Observable과 Observer의 역할을 동시에 수행.
외부에서 이벤트를 추가하고, 내부적으로 구독자들에게 이벤트를 전달.
주요 종류:
Relay
도 Subject
와 비슷하게 Observable의 역할과 Observer의 역할을 수행.
하지만 에러나 완료 이벤트를 방출하지 않도록 설계된 RxCocoa의 객체
에러나 완료가 되지 않기 때문에 주로 UI 이벤트 처리에서 사용(UI를 그리는 작업은 멈추면 안되기 때문), 애플리케이션 상태 관리에 유용
주요 종류:
BehaviorSubject
와 동작 논리는 같음PublishSubject
와 동작 논리가 같음Observable의 데이터를 변환하거나 필터링하는 데 사용.
Transform:
Filter:
Combine:
UIKit과의 연동:
Binding 지원:
Driver:
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
let disposeBag = DisposeBag()
let textField = UITextField()
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
// 텍스트 필드 입력 값을 라벨에 바인딩
textField.rx.text.orEmpty
.bind(to: label.rx.text)
.disposed(by: disposeBag)
}
}