RxSwift 실천 (1) 약술
그것 은 관찰자 의 모델 을 넓 혔 다.여러 개의 비동기 사건 을 자 유 롭 게 조합 할 수 있 도록 스 레 드, 동기 화, 스 레 드 안전, 병발 데이터 와 I / O 차단 에 관심 을 가 질 필요 가 없습니다.
함수 응답 식 프로 그래 밍
RxSwift 장점
프레임 워 크 는 우리 에 게 자주 사용 하 는 서열 을 많이 만들어 주 었 다.예 를 들 어 button 의 클릭, textField 의 현재 텍스트, switch 의 스위치 상태, slider 의 현재 수치 등 입 니 다.
let numbers: Observable = Observable.create { observer -> Disposable in
observer.onNext(0)
observer.onNext(1)
observer.onNext(2)
observer.onNext(3)
observer.onNext(4)
observer.onNext(5)
observer.onNext(6)
observer.onNext(7)
observer.onNext(8)
observer.onNext(9)
observer.onCompleted()
return Disposables.create()
}
Observer - 관찰자
관찰자 의 가장 직접적인 방법 은 Observable 의 subscribe 방법 뒤에 사건 이 발생 할 때 어떻게 응답 해 야 하 는 지 설명 하 는 것 이다.관찰 자 는 바로 뒤의 onNext, onError, onComplete 의 이 패키지 들 로 구 축 된 것 이다.
tap.subscribe(onNext: { [weak self] in
self?.showAlert()
}, onError: { error in
print(" : \(error.localizedDescription)")
}, onCompleted: {
print(" ")
})
조작 부호
//
let rxTemperature: Observable = ...
// filter
rxTemperature.filter { temperature in temperature > 33 }
.subscribe(onNext: { temperature in
print(" :\(temperature) ")
})
.disposed(by: disposeBag)
let disposeBag = DisposeBag()
Observable.of(1, 2, 3)
.map { $0 * 10 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
let disposeBag = DisposeBag()
let first = PublishSubject()
let second = PublishSubject()
Observable.zip(first, second) { $0 + $1 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
first.onNext("1")
second.onNext("A")
1A
Disposable - 지 울 수 있 는 자원
일반적으로 하나의 시퀀스 가 error 나 completed 사건 을 보 내 면 모든 내부 자원 이 방출 된다.이 자원 을 미리 방출 하거나 구독 을 취소 할 필요 가 있다 면 삭제 가능 한 자원 (Disposable) 을 disposable 로 호출 할 수 있 습 니 다.
일반적인 상황 에서 우 리 는 dispose 방법 을 수 동 으로 호출 할 필요 가 없다.
패키지 지우 기 (DisposeBag) 또는 takeUntil 연산 자 를 사용 하여 구독 의 수명 주 기 를 관리 합 니 다.
var disposeBag = DisposeBag()
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
textField.rx.text.orEmpty
.subscribe(onNext: { text in print(text) })
.disposed(by: self.disposeBag)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.disposeBag = DisposeBag()
}
override func viewDidLoad() {
super.viewDidLoad()
...
_ = usernameValid
.takeUntil(self.rx.deallocated)
.bind(to: passwordOutlet.rx.isEnabled)
_ = usernameValid
.takeUntil(self.rx.deallocated)
.bind(to: usernameValidOutlet.rx.isHidden)
_ = passwordValid
.takeUntil(self.rx.deallocated)
.bind(to: passwordValidOutlet.rx.isHidden)
_ = everythingValid
.takeUntil(self.rx.deallocated)
.bind(to: doSomethingOutlet.rx.isEnabled)
_ = doSomethingOutlet.rx.tap
.takeUntil(self.rx.deallocated)
.subscribe(onNext: { [weak self] in self?.showAlert() })
}
스케줄 러 - 스케줄 러
Schedulers 는 Rx 가 다 중 스 레 드 를 실현 하 는 핵심 모듈 로 작업 이 어느 스 레 드 나 대기 열 에서 실행 되 는 지 제어 하 는 데 사 용 됩 니 다.GCD:
// ,
DispatchQueue.global(qos: .userInitiated).async {
let data = try? Data(contentsOf: url)
DispatchQueue.main.async {
self.data = data
}
}
RxSwift:
let rxData: Observable = ...
rxData
.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated))
.observeOn(MainScheduler.instance)
.subscribe(onNext: { [weak self] data in
self?.data = data
})
.disposed(by: disposeBag)
오류 처리 - 오류 처리
Rx Swift 는 주로 두 가지 오류 처리 메커니즘 이 있 습 니 다.
let rxJson: Observable = ...
rxJson
.retry(3)
.subscribe(onNext: { json in
print(" JSON : \(json)")
}, onError: { error in
print(" JSON : \(error)")
})
.disposed(by: disposeBag)
실패 후 다시 세 번 시도
let maxRetryCount = 4 // 4
let retryDelay: Double = 5 // 5
rxJson
.retryWhen { (rxError: Observable) -> Observable in
return rxError.flatMapWithIndex { (error, index) -> Observable in
guard index < maxRetryCount else {
return Observable.error(error)
}
return Observable.timer(retryDelay, scheduler: MainScheduler.instance)
}
}
.subscribe(...)
.disposed(by: disposeBag)
catchError - 복구
let rxData: Observable = ... //
let cahcedData: Observable = ... //
rxData
.catchError { _ in cahcedData }
.subscribe(onNext: { date in
print(" : \(date.count)")
})
.disposed(by: disposeBag)
Result
오류 결과 보 여주 기
updateUserInfoButton.rx.tap
.withLatestFrom(rxUserInfo)
.flatMapLatest { userInfo -> Observable> in
return update(userInfo)
.map(Result.success) // Result
.catchError { error in Observable.just(Result.failure(error)) }
}
.observeOn(MainScheduler.instance)
.subscribe(onNext: { result in
switch result { // Result
case .success:
print(" ")
case .failure(let error):
print(" : \(error.localizedDescription)")
}
})
.disposed(by: disposeBag)
기타
그 다음 에 구체 적 인 실천 - UI 의 사용, 그리고 더 많은 이론 적 인 것 은 문 서 를 보면 OK 이 고 조작 부 호 를 만 나 서 다시 찾 아 보 겠 습 니 다.기본 상용 컨트롤 UITablView 와 UICollectionview 는 다른 상용 하지 않 는 컨트롤 을 사용 합 니 다. 모든 예 demo
참고 문헌
swift 개발 RxSwift 중국어 문서
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.