日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RxSwift之深入解析如何创建观察者Observer

發(fā)布時間:2024/5/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RxSwift之深入解析如何创建观察者Observer 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、什么是觀察者?

  • “觀察者”是用來監(jiān)聽事件,然后它需要這個事件做出響應(yīng)。例如:彈出提示框就是觀察者,它對點擊按鈕這個事件做出響應(yīng)。

  • 那么,什么是觀察者呢?其實,響應(yīng)事件的都是觀察者。
    • 當室溫高于 33 度時,打開空調(diào)降溫,打開空調(diào)降溫就是觀察者 Observer:

    • 當《海賊王》更新一集時,我們就立即觀看這一集,觀看這一集就是觀察者 Observer:

    • 當取到 JSON 時,將它打印出來,將它打印出來就是觀察者 Observer:

    • 當任務(wù)結(jié)束后,提示用戶任務(wù)已完成,提示用戶任務(wù)已完成就是觀察者 Observer:

二、如何創(chuàng)建觀察者?

  • 和 Observable 一樣,框架已經(jīng)幫我們創(chuàng)建好了許多常用的觀察者。例如:view 是否隱藏,button 是否可點擊, label 的當前文本,imageView 的當前圖片等。
  • 另外,有一些自定義的觀察者是需要我們自己創(chuàng)建的。例如,創(chuàng)建一個彈出提示框的的觀察者:
tap.subscribe(onNext: { [weak self] inself?.showAlert() }, onError: { error inprint("發(fā)生錯誤: \(error.localizedDescription)") }, onCompleted: {print("任務(wù)完成") })
  • 創(chuàng)建觀察者最直接的方法就是在 Observable 的 subscribe 方法后面描述,事件發(fā)生時,需要如何做出響應(yīng)。而觀察者就是由后面的 onNext,onError,onCompleted 的這些閉包構(gòu)建出來的。

三、AnyObserver

  • AnyObserver 可以用來描敘任意一種觀察者。
  • 打印網(wǎng)絡(luò)請求結(jié)果:
URLSession.shared.rx.data(request: URLRequest(url: url)).subscribe(onNext: { data inprint("Data Task Success with count: \(data.count)")}, onError: { error inprint("Data Task Error: \(error)")}).disposed(by: disposeBag)
  • 可以看作是:
let observer: AnyObserver<Data> = AnyObserver { (event) inswitch event {case .next(let data):print("Data Task Success with count: \(data.count)")case .error(let error):print("Data Task Error: \(error)")default:break} }URLSession.shared.rx.data(request: URLRequest(url: url)).subscribe(observer).disposed(by: disposeBag)
  • 用戶名提示語是否隱藏:
sernameValid.bind(to: usernameValidOutlet.rx.isHidden).disposed(by: disposeBag)
  • 可以看作是:
let observer: AnyObserver<Bool> = AnyObserver { [weak self] (event) inswitch event {case .next(let isHidden):self?.usernameValidOutlet.isHidden = isHiddendefault:break} }usernameValid.bind(to: observer).disposed(by: disposeBag)

四、Binder

  • Binder 主要有以下兩個特征:
    • 不會處理錯誤事件;
    • 確保綁定都是在給定 Scheduler 上執(zhí)行(默認 MainScheduler)。
  • 一旦產(chǎn)生錯誤事件,在調(diào)試環(huán)境下將執(zhí)行 fatalError,在發(fā)布環(huán)境下將打印錯誤信息。

① 示例

  • 在上文中的 AnyObserver ,我們舉了這樣一個例子:
let observer: AnyObserver<Bool> = AnyObserver { [weak self] (event) inswitch event {case .next(let isHidden):self?.usernameValidOutlet.isHidden = isHiddendefault:break} }usernameValid.bind(to: observer).disposed(by: disposeBag)
  • 由于這個觀察者是一個 UI 觀察者,所以它在響應(yīng)事件時,只會處理 next 事件,并且更新 UI 的操作需要在主線程上執(zhí)行。因此一個更好的方案就是使用 Binder:
let observer: Binder<Bool> = Binder(usernameValidOutlet) { (view, isHidden) inview.isHidden = isHidden }usernameValid.bind(to: observer).disposed(by: disposeBag)
  • Binder 可以只處理 next 事件,并且保證響應(yīng) next 事件的代碼一定會在給定 Scheduler 上執(zhí)行,這里采用默認的 MainScheduler。

② 復(fù)用

  • 由于頁面是否隱藏是一個常用的觀察者,所以應(yīng)該讓所有的 UIView 都提供這種觀察者:
extension Reactive where Base: UIView {public var isHidden: Binder<Bool> {return Binder(self.base) { view, hidden inview.isHidden = hidden}} } usernameValid.bind(to: usernameValidOutlet.rx.isHidden).disposed(by: disposeBag)
  • 這樣不必為每個 UI 控件單獨創(chuàng)建該觀察者,這就是 usernameValidOutlet.rx.isHidden 的由來,許多 UI 觀察者都是這樣創(chuàng)建的:
    • 按鈕是否可點擊 button.rx.isEnabled:
extension Reactive where Base: UIControl {public var isEnabled: Binder<Bool> {return Binder(self.base) { control, value incontrol.isEnabled = value}} }
    • label 的當前文本 label.rx.text:
extension Reactive where Base: UILabel {public var text: Binder<String?> {return Binder(self.base) { label, text inlabel.text = text}} }
  • 也可以用這種方式來創(chuàng)建自定義的 UI 觀察者。

總結(jié)

以上是生活随笔為你收集整理的RxSwift之深入解析如何创建观察者Observer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。