久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

給 iOS 開發(fā)者的 RxSwift(一)

 dxw555 2017-11-10


RxSwift 或許我們都聽說過,但或許只知道 RxSwift 這個單詞,,長篇大論關(guān)于 RxSwift 的介紹往往使讀者迷失在各種概念當(dāng)中,,卻不知如何讓它大展伸手?;蛟S我們可以換一種姿勢,,一些應(yīng)用場景會讓我們產(chǎn)生共鳴,解決問題的方式由很多,,為什么不找一種最優(yōu)的呢,?RxSwift也許會幫到你。


什么是 ReactiveX(Reactive Extensions)


An API for asynchronous programming

with observable streams


通過可觀察的流實現(xiàn)異步編程的一種API(不明白,?嗯,,看完所有的例子再讀一篇)


ReactiveX is more than an API, it's an idea and a breakthrough in programming. It has inspired several other APIs, frameworks, and even programming languages.


ReactiveX 不僅僅是一種 API 那么簡單,它更是一種編程思想的突破,。它已經(jīng)影響了其他 API,,frameworks,以及編程語言,。


它無處不在


它是跨平臺的(RxJS,,RxJava,,RxNET),也就是說掌握 RxSwift 這種思想,,學(xué)習(xí)其他的 Rx 系列的將非常簡單,。


先來個總結(jié)?還沒開始就總結(jié),!


ReactiveX(Reactive Extensions)是通過可觀察的流實現(xiàn)異步編程的一種API,,它結(jié)合了觀察者模式、迭代器模式和函數(shù)式編程的精華,。RxSwift 是 ReactiveX 編程思想的一種實現(xiàn),,幾乎每一種語言都會有那么一個 Rx[xxxx] 框架,比如 RxJava,,RxJS 等。Rx 可以概括為:


  • 觀察者模式 Observable:對某些數(shù)據(jù)流(很廣,,可以是一些事件等)進行處理,,使其變成可觀察對象(Observable)序列,這樣觀察者(observer)就可以訂閱這些序列,;

  • 操作符 Operators:然而對于訂閱者來說(observer)某些選項(items)并不是自己需要的(需要過濾),,某些選項(items)需要轉(zhuǎn)換才能達到自己的目的;

  • 迭代模式 Iterator:這樣集合或者序列中的值就可以進行遍歷了,。

  • 調(diào)度器 Scheduler:為了提升用戶體驗,,或其它目的,有些操作需要放到特定的線程去執(zhí)行,,比如 UI 操作需要放到主線程,,這就涉及到了調(diào)度器。


所以 Rx 可以這樣概括,,Rx = Observables LINQ Schedulers,,其中 LINQ(Language Integrated Query)語言集成查詢,比如那些操作符號,。


先來看個例子:修改用戶昵稱


用戶昵稱必須由3-10個字符組成,,用戶名不合法時顯示提示(昵稱由3-10個字符組成),且修改按鈕不可點擊,。


func registerRx() {

    let nickNameValid = nickNameTextField.rx.text.orEmpty

        .map { (text) -> Bool in

        let tLength = text.characters.count

        return tLength >= 3 && tLength <= 10

        }

        .share(replay: 1)

    

    nickNameValid

        .bind(to: alertLabel.rx.isHidden)

        .disposed(by: disposeBag)

    

    nickNameValid

        .bind(to: changeButton.rx.isEnabled)

        .disposed(by: disposeBag)

    changeButton.rx.tap

        .subscribe { (next) in

         print('修改昵稱成功!')

        }

        .disposed(by: disposeBag)

}


圖片發(fā)自簡書App


知識點說明


  • 安裝 RxSwift 時會安裝 RxSwift(對ReactiveX的實現(xiàn)) 和 RxCocoa(對iOS cocoa 層的實現(xiàn)),;

  • orEmpty:主要使 String? 類型變?yōu)?String類型;

  • map:它屬于 Rx 變換操作中的一種,,主要對 Observable 發(fā)射的數(shù)據(jù)應(yīng)用一個函數(shù),,執(zhí)行某種操作,返回經(jīng)過函數(shù)處理過的 Observable,。Observable 可觀察的對象,,用來被觀察者(observer)訂閱,,這樣observe可以監(jiān)聽Observable發(fā)出的事件;

  • share(replay: 1):只允許監(jiān)聽一次,;


到這里,,還不了解基本概念?


Observable


Observable 直譯為可觀察的,,它在 RxSwift 起到了舉足輕重的作用,,在整個 RxSwift 的使用過程中你會經(jīng)常與它打交道。如果你使用過 RAC ,,它如同 Signal 一樣,。RxSwift 中關(guān)鍵點就是在于如何把普通的數(shù)據(jù)或者事件變成可觀察的,這樣當(dāng)某些數(shù)據(jù)或事件有變化的時候就會通知它的訂閱者,。


那如何能夠讓某些數(shù)據(jù)或事件成為 Observable 呢,?

RxSwift 中提供很多種創(chuàng)建 Observable 創(chuàng)建方法。比如:From,、never,、emptycreate 等,更多創(chuàng)建方法,。訂閱者可以收到 3 個事件,,onNextonErroronCompleted,,每個 Observable 都應(yīng)該至少有一個 onErroronCompleted 事件,,onNext 表示它傳給下一個接收者時的數(shù)據(jù)流。


func create() {

       let observable = Observable<String>.create { (observer) -> Disposable in

        observer.onNext('Hello Lefe_x, I am here!')

        observer.onCompleted()

            return Disposables.create()

        }

        

        observable.subscribe(onNext: { (text) in

            print(text)

        }, onError: nil, onCompleted: {

            print('complete!')

        }, onDisposed: nil).disposed(by: disposeBag)

    }



Lefe_x 經(jīng)常刷微博,,剛開始時他并不刷微博,,別人也不會看到他發(fā)的內(nèi)容(這時他是不可訂閱的)。某天,,Lefe_x 想讓自己學(xué)到的知識能幫助更多的同學(xué),,他就注冊了微博,開始了刷微博之旅(變成了可訂閱的 Observable),,這樣別人就可以關(guān)注他(訂閱),。慢慢地,越來越多的人開始關(guān)注他,,這樣當(dāng)他發(fā)微博(事件流)的時候,,它的粉絲就可以被提醒(通知訂閱者),這些提醒有不同功能,,比如有的是提醒 Lefe_x 發(fā)布了新微博,,有的提醒微博被轉(zhuǎn)發(fā)了(相當(dāng)于 onNextonErroronCompleted 事件),。


Operators 操作符


Observable 創(chuàng)建后,,可能為了滿足某些需求需要修改它,,這時就需要用到操作符。RxSwift 提供了非常多的操作符,,當(dāng)然不必要一一掌握這些操作符,,使用的時候查一下即可,當(dāng)然常見的操作符必須要掌握,,比如 map,、flatMapcreate ,、filter 等,。這里查看更多


再來個例子放松下:


這個例子主要把查找數(shù)組中的字符串 Lefe_x,并顯示到 Label 上,。


override func viewDidLoad() {

    super.viewDidLoad()

    DispatchQueue.global().async {

        self.from()

    }

}

    

func from() {

    Observable.from(['Lefe', 'Lefe_x', 'lefex', 'wsy', 'Rx'])

        .subscribeOn(MainScheduler.instance)

        .filter({ (text) -> Bool in

            return text == 'Lefe_x'

        })

        .map({ (text) -> String in

            return '我的新浪微博是: ' text

        })

        .subscribe(onNext: { [weak self] (text) in

            self?.nickNameLabel.text = text

        })

        .disposed(by: disposeBag)

}


運行結(jié)果為:



呀,,這不是前幾天有人寫過的嗎?沒錯,,那是前幾天發(fā)的一個 #iOS知識小集# ,,不過哪里只是一個總結(jié),沒有詳細的說明,。這里主要說一下調(diào)度器 (Scheduler)。


Scheduler 調(diào)度器


如果你想給 Observable 操作符鏈添加多線程功能,,你可以指定操作符(或者特定的Observable)在特定的調(diào)度器(Scheduler)上執(zhí)行,。對于 ReactiveX 中可觀察對象操作符來說,它有時會攜帶一個調(diào)度器作為參數(shù),,這樣可以指定可觀察對象在哪一個線程中執(zhí)行,。而默認的情況下,某些可觀察對象是在訂閱者訂閱時的那個線程中執(zhí)行,。SubscribeOn 可以改變可觀察對象該在那個調(diào)度器中執(zhí)行,。ObserveOn 用來改變給訂閱者發(fā)送通知時所在的調(diào)度器。這樣就可以使可觀察對象想在那個調(diào)度器中執(zhí)行就在那個調(diào)度器中執(zhí)行,,不受約束,,而這些細節(jié)是不被調(diào)用者所關(guān)心的。猶如 GCD 一樣,,你只管使用,,底層線程是咋么創(chuàng)建的,你不必關(guān)心,。


參考



NEW RECOMMEND

新/品/推/薦

¥ 68

 立即搶購>> 


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多