問題
問題一:訂閱了幾次 請求了幾次,浪費網(wǎng)絡
問題二:返回來的在子線程该园,子線程更新UI問題
問題三:錯誤事件
let result = textFiled.rx.text.skip(1).flatMap { [weak self](input) -> Observable<Any> in
return (self?.dealWithData(inputText: input ?? ""))!
}
result.subscribe(onNext: { (element) in
print("訂閱到0:\(element)")
})
result.subscribe(onNext: { (element) in
print("訂閱到1:\(element) - \(Thread.current)")
})
func dealWithData(inputText: String) -> Observable<Any> {
print("請求網(wǎng)絡了 \(Thread.current)")
return Observable<Any>.create({ (ob) -> Disposable in
if inputText == "1234" {
ob.onError(NSError.init(domain: "com.dyz.cn", code: 2019, userInfo: nil))
}
DispatchQueue.global().async {
print("發(fā)送之前看看:\(Thread.current)")
ob.onNext("已經(jīng)輸入:\(inputText)")
ob.onCompleted()
}
return Disposables.create()
})
}
請求網(wǎng)絡了 <NSThread: 0x600001325b80>{number = 1, name = main}
發(fā)送之前看看:<NSThread: 0x60000135ac00>{number = 3, name = (null)}
請求網(wǎng)絡了 <NSThread: 0x600001325b80>{number = 1, name = main}
訂閱到0:已經(jīng)輸入:
發(fā)送之前看看:<NSThread: 0x600001353240>{number = 4, name = (null)}
訂閱到1:已經(jīng)輸入: - <NSThread: 0x600001353240>{number = 4, name = (null)}
解決方案
問題一:share(replay: 1, scope: .whileConnected)
問題二:observeOn(MainScheduler.instance)
問題三:catchErrorJustReturn("檢測到了錯誤事件")
let result = textFiled.rx.text.skip(1).flatMap { [weak self](input) -> Observable<Any> in
return (self?.dealWithData(inputText: input ?? ""))!.observeOn(MainScheduler.instance).catchErrorJustReturn("檢測到了錯誤事件")
}.share(replay: 1, scope: .whileConnected)
Driver 登場
1、請求一次網(wǎng)絡
2鹿蜀、綁定到了UI - 主線程
3庵佣、title - 非error
let result = textFiled.rx.text.orEmpty.asDriver().flatMap {
return self.dealWithData(inputText: $0).asDriver(onErrorJustReturn: "檢測到了錯誤事件")
}
//map 只是映射 讓它轉(zhuǎn)換一下 Observable<Any>的Any->String
result.map { "長度:\(($0 as! String).count)" }.drive(self.label.rx.text)
// result.drive(self.textLabel.rx.text) //需要把Observable<Any> 中的Any 改成 String
result.map { "\($0 as! String)" }.drive(self.button.rx.title())
func dealWithData(inputText: String) -> Observable<Any> {
print("請求網(wǎng)絡了 \(Thread.current)")
return Observable<Any>.create({ (ob) -> Disposable in
if inputText == "1234" {
ob.onError(NSError.init(domain: "com.dyz.cn", code: 2019, userInfo: nil))
}
DispatchQueue.global().async {
print("發(fā)送之前看看:\(Thread.current)")
ob.onNext("已經(jīng)輸入:\(inputText)")
ob.onCompleted()
}
return Disposables.create()
})
}
Driver 源碼解析
let result = inputTF.rx.text.orEmpty.asDriver().flatMap {
return self.dealWithData(inputText: $0).asDriver(onErrorJustReturn: "檢測到了錯誤事件")
}
1.1 找observeOn(MainScheduler.instance)
1.1.1 點擊 asDriver(onErrorJustReturn: ) 中 asDriver
public func asDriver(onErrorJustReturn: Element) -> Driver<Element> {
let source = self
.asObservable()
.observeOn(DriverSharingStrategy.scheduler)
.catchErrorJustReturn(onErrorJustReturn)
return Driver(source)
}
1.1.2 點擊 scheduler
public struct DriverSharingStrategy: SharingStrategyProtocol {
public static var scheduler: SchedulerType { return SharingScheduler.make() }
public static func share<Element>(_ source: Observable<Element>) -> Observable<Element> {
return source.share(replay: 1, scope: .whileConnected)
}
}
1.1.3 點擊make
public private(set) static var make: () -> SchedulerType = { MainScheduler() }
1.2 找catchErrorJustReturn("檢測到了錯誤事件") >>>>>>>有點懵
1.2.1 點擊 asDriver()
public func asDriver() -> Driver<Element> {
return self.asDriver { _ -> Driver<Element> in
#if DEBUG
rxFatalError("Somehow driver received error from a source that shouldn't fail.")
#else
return Driver.empty()
#endif
}
}
1.2.2 點擊 .asDriver { }
public func asDriver(onErrorRecover: @escaping (_ error: Swift.Error) -> Driver<Element>) -> Driver<Element> {
let source = self
.asObservable()
.observeOn(DriverSharingStrategy.scheduler)
.catchError { error in
onErrorRecover(error).asObservable()
}
return Driver(source)
}
1.3 找share(replay: 1, scope: .whileConnected)
1.3.1 點擊 asDriver(onErrorJustReturn: ) 中 asDriver
public func asDriver(onErrorJustReturn: Element) -> Driver<Element> {
let source = self
.asObservable()
.observeOn(DriverSharingStrategy.scheduler)
.catchErrorJustReturn(onErrorJustReturn)
return Driver(source)
}
1.3.2 點擊 Driver()
public typealias Driver<Element> = SharedSequence<DriverSharingStrategy, Element>
public struct DriverSharingStrategy: SharingStrategyProtocol {
public static var scheduler: SchedulerType { return SharingScheduler.make() }
public static func share<Element>(_ source: Observable<Element>) -> Observable<Element> {
return source.share(replay: 1, scope: .whileConnected)
}
}
1.3.3 點擊 SharedSequence
1.3.3.1、SharedSequence<DriverSharingStrategy, Element> 傳入DriverSharingStrategy
1.3.3.2婿斥、init(_ source: Observable<Element>) { self._source = SharingStrategy.share(source) } 初始化
1.3.3.3劝篷、SharingStrategy.share(source) DriverSharingStrategy執(zhí)行share方法
public struct SharedSequence<SharingStrategy: SharingStrategyProtocol, Element> : SharedSequenceConvertibleType {
let _source: Observable<Element>
init(_ source: Observable<Element>) {
self._source = SharingStrategy.share(source)
}
/**
- returns: Built observable sequence.
*/
public func asObservable() -> Observable<Element> {
return self._source
}
/**
- returns: `self`
*/
public func asSharedSequence() -> SharedSequence<SharingStrategy, Element> {
return self
}
}
1.3.4 點擊share 選擇DriverSharingStrategy 來到 1.3.2中的share方法
public static func share<Element>(_ source: Observable<Element>) -> Observable<Element> {
return source.share(replay: 1, scope: .whileConnected)
}