RxSwift的使用

rxswift 是時間監(jiān)聽框架渔呵,每一個事件比如文本的改變,按鈕的點擊或者網(wǎng)絡(luò)請求的結(jié)束砍鸠,每一個事件可以看成一個管道sequence扩氢,事件從管道流程,然后只需要監(jiān)聽這個管道就可以實現(xiàn)事件的監(jiān)聽

  • 核心思想是Observable爷辱,即可監(jiān)聽的序列
  • 通過DisposeBag來取消監(jiān)聽录豺,所有監(jiān)聽后面都會增加.addDisposableTo(bag)
  1. 控件的監(jiān)聽

    a. UISliderde 的監(jiān)聽

    slider.rx.value.asObservable()
            .subscribe(onNext: {
                print("當(dāng)前值為:\($0)")
              })
            .disposed(by: disposeBag)
    
    • 任何對象通過asObservable都可以實現(xiàn)監(jiān)聽,比如collectionView.mj_footer!.rx.refreshing.asObservable()

    將UISliderde中的值賦值給UIStepper

    slider.rx.value
    .map{ Double($0) }  //由于slider值為Float類型饭弓,而stepper的stepValue為Double類型双饥,因此需要轉(zhuǎn)換
    .bind(to: stepper.rx.stepValue)
    .disposed(by: disposeBag)
    
  2. 表中的數(shù)據(jù)刷新

    let item = Observable<[SocilaModel]>.just(self.dataArr!)
    //或者使用
    let item = Observable.from(optional: self.dataArr!)
    
    item.bind(to: self.listTab.rx.items) { (tableView, row, element) in
                      let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
                          as! SecondSocialTableViewCell                
                   cell.leftImageView.kf.setImage(with: URL(string: element.image_list ?? ""))
                   cell.titleLabel.text = element.theme_name
                   cell.descripLabel.text = element.info
                      //cell中按鈕點擊事件訂閱
                      cell.RXButton.rx.tap.asDriver()
                             .drive(onNext: { [weak self] in
                                 self?.showAlert(title: "\(row)", message: "哈哈哈")
                             }).disposed(by: cell.disposeBag)
    
                      return cell
                  }
              .disposed(by: self.disposeBag)
    
            }
       }
    

3.按鈕的點擊監(jiān)聽

button1.rx.tap.subscribe { (event) in    
self.button1.setTitle("按鈕1", for: .normal)    
print("button1")}.addDisposableTo(self.disposeBag)    

button2.rx.tap.subscribe { (event) in   
 self.textField2.text = "按鈕2被點擊了"
}.addDisposableTo(self.disposeBag)

4.監(jiān)聽UITextfield的文字改變

a.使用on方法實現(xiàn)

textField1.rx.text.subscribe { (event: Event<String?>) in    
//將UITextField文字改變的內(nèi)容顯示在Label中    
self.label1.text = event.element!        
print(event.element!!)}.addDisposableTo(self.disposeBag) 

textField2.rx.text.subscribe { (event: Event<String?>) in   
 print(event.element)//報警告    //輸出: Optional(Optional("jun"))
}.addDisposableTo(self.disposeBag)

b.使用onNext方法實現(xiàn)

textField1.rx.text.subscribe(onNext: { (str: String?) in    
self.label1.text = str!}).addDisposableTo(self.disposeBag)

c.多個textField的監(jiān)聽,并通過監(jiān)聽改變button 的透明度

Observable.combineLatest(phoneTextField.rx.text, passwordCodeTextField.rx.text)
                .map({ (userName, password) in
                    if (userName?.count ?? 0) >= 11 && (password?.count ?? 0) >= 4 {
                        return CGFloat(1)
                    }
                    return CGFloat(0.2)
                })
                .bind(to: loginButton.rx.alpha)
                .disposed(by: disposeBag)
  1. Driver的使用示启,主要比如多次請求只需要處理一次數(shù)據(jù)

    序列需要滿足下面的條件才可以使用:

    • 不會產(chǎn)生 error 事件
    • 一定在主線程監(jiān)聽(MainScheduler)
    • 共享狀態(tài)變化(shareReplayLatestWhileConnected)

    使用場景:

  1. Driver 最常使用的場景應(yīng)該就是需要用序列來驅(qū)動應(yīng)用程序的情況了兢哭,比如通過 CoreData 模型驅(qū)動 UI;使用一個 UI 元素值(綁定)來驅(qū)動另一個 UI 元素值
  1. 與普通的操作系統(tǒng)驅(qū)動程序一樣,如果出現(xiàn)序列錯誤夫嗓,應(yīng)用程序?qū)⑼V鬼憫?yīng)用戶輸入迟螺。
  1. 在主線程上觀察到這些元素也是極其重要的,因為 UI 元素和應(yīng)用程序邏輯通常不是線程安全的舍咖。
  1. 此外矩父,使用構(gòu)建 Driver 的可觀察的序列,它是共享狀態(tài)變化排霉。

使用案例

let result = inputTF.rx.text.orEmpty
            .asDriver()
            .flatMap {  return self.dealwithData(inputText: $0)
            .asDriver(onErrorJustReturn: "檢測到了錯誤事件") }

第一次訂閱

//第一次訂閱,并把內(nèi)容綁定到另一個UILabel上
result.map{ "長度:\( ($0 as! String).count )" }
.drive(self.textLabel.rx.text)
.disposed(by: disposeBag)
//第二次訂閱,并把內(nèi)容綁定到另一個UIButton上
result.map { "\($0 as! String)"}
.drive(self.btn.rx.title())
.disposed(by: disposeBag)
  1. 改變label 中文字

    label1.rx.observe(String.self, "text")
    .subscribe(onNext: { (str: String?) in   
    print(str!)}).addDisposableTo(disposeBag)        
    
    label2.rx.observe(CGRect.self, "frame")
    .subscribe(onNext: { (rect: CGRect?) in   
    print(rect!.width)}).addDisposableTo(disposeBag)
    

    7.監(jiān)聽UIScrollView的滾動

scrollView.contentSize = CGSize(width: 1000, height: 0)
scrollView.rx.contentOffset.subscribe(onNext: { (point : CGPoint) in
      print(point)}).addDisposableTo(disposeBag) 

參考文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窍株,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子攻柠,更是在濱河造成了極大的恐慌球订,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瑰钮,死亡現(xiàn)場離奇詭異冒滩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浪谴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門开睡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人苟耻,你說我怎么就攤上這事篇恒。” “怎么了凶杖?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵胁艰,是天一觀的道長。 經(jīng)常有香客問我,道長蝗茁,這世上最難降的妖魔是什么醋虏? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮哮翘,結(jié)果婚禮上颈嚼,老公的妹妹穿的比我還像新娘。我一直安慰自己饭寺,他們只是感情好阻课,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著艰匙,像睡著了一般限煞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上员凝,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天署驻,我揣著相機(jī)與錄音,去河邊找鬼健霹。 笑死旺上,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的糖埋。 我是一名探鬼主播宣吱,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瞳别!你這毒婦竟也來了征候?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤祟敛,失蹤者是張志新(化名)和其女友劉穎疤坝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馆铁,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跑揉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了叼架。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畔裕。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡衣撬,死狀恐怖乖订,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情具练,我是刑警寧澤乍构,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響哥遮,放射性物質(zhì)發(fā)生泄漏岂丘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一眠饮、第九天 我趴在偏房一處隱蔽的房頂上張望奥帘。 院中可真熱鬧,春花似錦仪召、人聲如沸寨蹋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽已旧。三九已至,卻和暖如春召娜,著一層夾襖步出監(jiān)牢的瞬間运褪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工玖瘸, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留秸讹,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓店读,卻偏偏與公主長得像嗦枢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屯断,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一. RxSwift簡介 推薦: RxSwift官方文檔中文: RxSwift官方文檔的中文翻譯 RxSwift是...
    TitanCoder閱讀 6,990評論 0 23
  • RxSwift的使用詳解 一. RxSwift簡介 推薦: RxSwift官方文檔[https://link.ju...
    adaodao3056閱讀 39,651評論 1 41
  • 發(fā)現(xiàn) 關(guān)注 消息 RxSwift入坑解讀-你所需要知道的各種概念 沸沸騰關(guān)注 2016.11.27 19:11*字...
    楓葉1234閱讀 2,795評論 0 2
  • RxSwift把我們程序中每一個操作都看成一個事件文虏,比如一個TextField中的文本改變,一個按鈕被點擊殖演,或者一...
    水落斜陽閱讀 798評論 0 2
  • 什么是響應(yīng)式編程 響應(yīng)式編程是一種和事件流有關(guān)的編程模式氧秘,關(guān)注導(dǎo)致狀態(tài)值改變的行為事件,一系列事件組成了事件流趴久。 ...
    海邊的1984_閱讀 843評論 1 2