
button.addTarget(self, action: #selector(didTapButton), for: .touchUpInside)
@objc func didTapButton() {
print("버튼 눌림")
}
button.rx.tap
.subscribe(onNext: {
print("버튼 눌림")
})
Observable: 이벤트를 발생시키는 것Observer: 이벤트를 받는 것Subscribe: 연결Observable.just: 값 하나
Observable.of: 여러 값을 직접 넣음
Observable.from: 배열을 풀어서 보냄
Observable.create: 내가 직접 이벤트 생성
// 예시 에러 선언
struct MyError: Error {}
// 구독 해제를 위한 DisposeBag 선언
// 구독을 하고 나선 구독 해제를 반드시 해줘야함
let disposeBag = DisposeBag()
// observable 생성.
// create 클로저 안에 방출할 데이터를 선언
let observable = Observable<String>.create { observe in
// 정상적인 데이터 방출
observe.onNext("Apple")
observe.onNext("Banana")
observe.onNext("Cake")
// 에러 방출
observe.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)
PrimitiveSequence: Single, Maybe, CompletableUI Trait: Driver, Signalfunc fetchUser() -> Single<User> {
return Single.create { single in
let user = User(name: "yeseul")
single(.success(user))
return Disposables.create()
}
}
success(value),failure(error))onSuccess : Observable의 onNext 와 같은 개념.onFailure : Observable의 onError 와 같은 개념.onCompleted 는 존재하지 않음. 하나의 값을 방출하거나, 에러를 방출하면 곧바로 스트림이 종료fetchUser()
.subscribe(onSuccess: { user in
print(user.name)
})
complete 되거나, 에러를 방출.complete 될 수도 있음Completable 을 사용합니다.viewModel.title
.drive(label.rx.text)
.disposed(by: disposeBag)
Observable.merge(button1.rx.tap, button2.rx.tap)
MainScheduler.instanceDispatchQueue 기반의 스케줄러ConcurrentDispatchQueueScheduler(qos: .background)DispatchQueue에서 직렬 작업을 실행하는 스케줄러subscribOn 과 observeOn 은 옵저버블이 처리되어야 할 스레드를 지정하는 역할
subscribeOn : 스트림의 시작되는 곳의 스레드를 지정
observeOn : 다운스트림의 스레드를 지정
Observable.of(1,2,3)
.subscribe(on: ConcurrentDispatchQueueScheduler(qos: .background))
.subscribe(onNext: {
print(Thread.isMainThread)
})
Observable.of(1,2,3)
.observe(on: MainScheduler.instance)
.subscribe(onNext: {
print(Thread.isMainThread)
})
Observable.of(1,2,3)
.subscribe(on: backgroundScheduler)
.observe(on: MainScheduler.instance)
.subscribe(onNext: {
print(Thread.isMainThread)
})
api.fetchMovies()
.subscribe(on: ConcurrentDispatchQueueScheduler(qos: .background))
.observe(on: MainScheduler.instance)
.subscribe(onNext: { movies in
self.collectionView.reloadData()
})
let subject = PublishSubject<String>()
subject.onNext("A")
subject.onNext("B")
subject.subscribe(onNext: {
print($0)
})
subject.onNext("C")
// C
let subject = BehaviorSubject(value: "A") // 초기값 A
subject.onNext("B") // B 등록
subject.subscribe(onNext: {
print($0) // 등록하는 순간 최신값 뱉음
})
subject.onNext("C") // C 등록하고 구독자가 있으니 C 뱉음
let relay = PublishRelay<String>()
relay.subscribe(onNext: {
print($0)
})
relay.accept("Hello")
relay.accept("RxSwift")
// Hello
// RxSwift
let relay = BehaviorRelay(value: 0)
relay.accept(1)
relay.accept(2)
relay.subscribe(onNext: {
print($0)
})
// 2