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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RxSwift 系列(一)

發(fā)布時(shí)間:2023/12/2 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RxSwift 系列(一) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為什么使用RxSwift?

我們編寫的代碼絕大多數(shù)都涉及對(duì)外部事件的響應(yīng)。當(dāng)用戶點(diǎn)擊操作時(shí),我們需要編寫一個(gè)@IBAction事件來響應(yīng)。我們需要觀察通知,以檢測(cè)鍵盤何時(shí)改變位置。當(dāng)網(wǎng)絡(luò)請(qǐng)求響應(yīng)數(shù)據(jù)時(shí),我們必須提供閉包來執(zhí)行。我們使用KVO來檢測(cè)變量的變化。所有這些不同的系統(tǒng)使我們的代碼增加了不必要地復(fù)雜。如果有一個(gè)一致的系統(tǒng)來處理我們的所有的調(diào)用/響應(yīng)代碼,難道不是更好嗎?Rx就是這樣一個(gè)系統(tǒng)。

RxSwift是用于大多數(shù)主要語言和平臺(tái)的響應(yīng)擴(kuò)展(即Rx)的正式實(shí)現(xiàn)。

概念

每一個(gè)Observable的實(shí)例都是一個(gè)序列

Observable序列相比于Swift序列的關(guān)鍵優(yōu)勢(shì)點(diǎn)在于它能夠異步地接收元素。這是RxSwift精髓所在,其他的一切都擴(kuò)展了這個(gè)概念。

  • Observable(ObservableType)等效于Sequence
  • observableType.subscribe(_:)方法等效于Sequence.makeIterator()
  • ObservableType.subscribe(_:)接收一個(gè)觀察者ObserverType參數(shù),它將被訂閱自動(dòng)接收由可觀察到的序列事件和元素,而不是在返回的生成器上手動(dòng)調(diào)用next()

如果一個(gè)Observable發(fā)出一個(gè)next事件(Event.next(Element)),它還能夠繼續(xù)發(fā)出更多的事件。但是,如果一個(gè)Observable發(fā)出一個(gè)error事件(Event.error(ErrorType))或者一個(gè)completed事件(Event.completed),那么這個(gè)Observable序列就不能給訂閱者發(fā)送其他的事件了。

Observables and Observers(又名subscribers -- 訂閱者)

除非有訂閱者,否則Observable不會(huì)執(zhí)行它們的閉包。
在下面的例子中,Observable的閉包將不會(huì)被執(zhí)行,因?yàn)闆]有訂閱者訂閱。

_ = Observable<String>.create({ (observingString) -> Disposable inprint("the code will not be executed")observingString.onNext("?")observingString.onCompleted()return Disposables.create()})

在下面的例子中,Observable的閉包將會(huì)被執(zhí)行,因?yàn)橛杏嗛喺哂嗛啞?/p> _ = Observable<String>.create({ (observingString) -> Disposable inprint("the code will be executed")observingString.onNext("?")observingString.onCompleted()return Disposables.create()}).subscribe({ (event) inprint(event)})

我們現(xiàn)在不必?fù)?dān)心上面例子中的Observable是怎樣被創(chuàng)建出來,我會(huì)和大家一步一步深入學(xué)習(xí)。

subscribe(_:)返回一個(gè)一次性的實(shí)例,該實(shí)例表示一個(gè)可使用的資源,如訂閱。在前面的簡單示例中,它被忽略了,但是應(yīng)該正常地處理它。這通常意味著將它添加到一個(gè)DisposeBag實(shí)例中。

Creating and Subscribing to Observables

有幾種方式創(chuàng)建和訂閱Observables:

  • never
    創(chuàng)建一個(gè)永不終止且不發(fā)出任何事件的序列。更多詳情

    let disposeBag = DisposeBag() Observable<String>.never().subscribe({ (_) inprint("this will never be printed") }).disposed(by: disposeBag)
  • empty
    創(chuàng)建一個(gè)只發(fā)送completed事件的空Observable序列。更多詳情

    let disposeBag = DisposeBag() Observable<Int>.empty().subscribe({ (event) inprint(event) }).disposed(by: disposeBag)
  • just
    創(chuàng)建一個(gè)只有一個(gè)元素的Observable序列。更多詳情

    let disposeBag = DisposeBag() Observable.just("單一元素").subscribe({ (event) inprint(event) }).disposed(by: disposeBag)
  • of
    創(chuàng)建一個(gè)固定數(shù)量元素的Observable序列。

    let disposeBag = DisposeBag() Observable.of("元素1","元素2","元素3","元素4","元素5").subscribe(onNext: { (element) inprint(element) }).disposed(by: disposeBag)

    注意:此處用到了subscribe(onNext:)的便利構(gòu)造方法,有部分參數(shù)使用的是默認(rèn)值。

  • from
    從一個(gè)序列(如Array/Dictionary/Set)中創(chuàng)建一個(gè)Observable序列。

    let disposeBag = DisposeBag() Observable.from(["元素1","元素2","元素3","元素4","元素5"]).subscribe(onNext: {print($0) }).disposed(by: disposeBag)

    注意:這個(gè)例子使用了默認(rèn)參數(shù)$0而不是顯式地命名參數(shù)。

  • create
    創(chuàng)建一個(gè)自定義的Observable序列。更多詳情

    let disposeBag = DisposeBag() let myjust = { (element: String) -> Observable<String> inreturn Observable.create{ observer inobserver.on(.next(element))observer.on(.completed)return Disposables.create()} }myjust("籃球").subscribe({ (element) inprint(element) }).disposed(by: disposeBag)
  • range
    創(chuàng)建一個(gè)Observable序列,它會(huì)發(fā)出一系列連續(xù)的整數(shù),然后終止。更多詳情

    let disposeBag = DisposeBag() Observable.range(start: 1, count: 10).subscribe { print($0) }.disposed(by: disposeBag)
  • repeatElement
    創(chuàng)建一個(gè)Observable序列,它可以無限地釋放給定元素。更多詳情

    let disposeBag = DisposeBag() Observable.repeatElement("?").take(3).subscribe(onNext: {print($0)}).disposed(by: disposeBag)

    上述例子中take操作符從一個(gè)序列開始返回指定數(shù)量的元素。

  • generate
    創(chuàng)建一個(gè)Observable序列,只要提供的條件值為true就可以生成值。

    let disposeBag = DisposeBag() Observable.generate(initialState: 0, condition: {$0 < 3}, iterate: {$0 + 1}).subscribe(onNext: {print($0)}).disposed(by: disposeBag)
  • deferred
    為每一個(gè)訂閱者創(chuàng)建一個(gè)新的Observable序列。更多詳情

    let disposeBag = DisposeBag() var count = 1 let defferedSequen = Observable<String>.deferred {print("count = \(count)")count += 1return Observable.create({ (observer) -> Disposable inobserver.onNext("山羊")observer.onNext("野豬")observer.onNext("小貓")return Disposables.create()}) }defferedSequen.subscribe(onNext: {print($0)}).disposed(by: disposeBag) defferedSequen.subscribe(onNext: {print($0)}).disposed(by: disposeBag)
  • error
    創(chuàng)建一個(gè)不會(huì)發(fā)送任何條目并且立即終止錯(cuò)誤的Observable序列。

    let disposeBag = DisposeBag() Observable<Int>.error(TestError.test).subscribe { print($0) }.disposed(by: disposeBag)
  • do
    為每個(gè)發(fā)出的事件調(diào)用一個(gè)副作用操作,并返回(通過)原始事件。更多詳情

    let disposeBag = DisposeBag() Observable.of(["元素1","元素2","元素3"]).do(onNext: {print("next:\($0)")}, onError: {print("error:\($0)")}, onCompleted: { print("completed") }).subscribe(onNext: {print($0)}).disposed(by: disposeBag)

致謝

若發(fā)現(xiàn)有錯(cuò)誤的地方,歡迎各位評(píng)論,感謝!同時(shí)也希望能夠幫助到有需要的同學(xué)。

轉(zhuǎn)載于:https://www.cnblogs.com/yujihaia/p/7425849.html

總結(jié)

以上是生活随笔為你收集整理的RxSwift 系列(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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