使用RxSwift所遇到的坑

摘要:當(dāng)Swift迅速崛起、并漸漸取代oc成功iOS開發(fā)的首選語(yǔ)言的時(shí)候缀拭,Swift的相關(guān)框架也是如雨后春筍般冒了出來(lái)犬耻。RxSwift作為響應(yīng)式編程的框架。既能完美兼容Swift勋乾,又能強(qiáng)健項(xiàng)目架構(gòu)宋下。很強(qiáng)大。
前段時(shí)間辑莫,公司也是用RxSwift的架構(gòu)重構(gòu)了公司項(xiàng)目学歧。RxSwift雖然語(yǔ)法簡(jiǎn)潔精煉,可以很大程度上減少代碼數(shù)量各吨。但其中也存在一些坑枝笨,也不知是自己理解不到位還是確實(shí)是坑。在此記錄下來(lái)揭蜒。避免以后遇到不知所措

  • UITableView的左滑刪除

  1. 場(chǎng)景描述:
    tableView的DataSource是用RxSwift雙向綁定的横浑,row的點(diǎn)擊也是通過RxSwift來(lái)監(jiān)聽的。但我設(shè)置tableView的代理給ViewController(控制器)忌锯,并實(shí)現(xiàn)左滑刪除的代理時(shí)伪嫁。發(fā)現(xiàn)該代理不起作用。

有區(qū)別的主要代碼如下

/// 聲明一個(gè)可被觀察的數(shù)組
var arr = Variable<[XYJPersonMsg]>([])

// 綁定數(shù)據(jù)源
        _ = arr.asObservable().bind(to: tableView.rx.items(cellIdentifier: XYJPersonMsgCell.cellIdentifi, cellType: XYJPersonMsgCell.self)) { row, element, cell in
            cell.model = element
            // 隱藏mj_footer
            self.tableView.mj_footer.isHidden = self.tableView.mj_footer.frame.origin.y <= self.tableView.frame.maxY
            
        }
        
        
        // 設(shè)置代理
        tableView.rx.setDelegate(self).disposed(by: disposeBag)
  1. 解決問題:
    將該控制器中的RxSwift實(shí)現(xiàn)方式改成常用的設(shè)置代理的方式實(shí)現(xiàn)

有區(qū)別的主要代碼如下:

var arr = [XYJPersonMsg]()

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
        return self.arr.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{

        let cell: XYJPersonMsgCell = tableView.dequeueReusableCell(withIdentifier: XYJPersonMsgCell.cellIdentifi) as? XYJPersonMsgCell ?? XYJPersonMsgCell.init(style: .default, reuseIdentifier: XYJPersonMsgCell.cellIdentifi)
        cell.model = self.arr[indexPath.row]

        // 隱藏mj_footer
        self.tableView.mj_footer.isHidden = self.tableView.mj_footer.frame.origin.y <= self.tableView.frame.maxY
        return cell
    }
    
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let vc = XYJPersonDetailVC()
        vc.title = "個(gè)人消息"
        vc.personModel = self.arr[indexPath.row]
        
        // 更新閱讀狀態(tài)
        self.arr = self.arr.enumerated().map({ (index,model) -> XYJPersonMsg in
            if indexPath.row == index {
                model.read_flag = 2
            }
            return model
        })
        tableView.reloadData()
        self.navigationController?.pushViewController(vc, animated: true)
    }

公共的代理代碼

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
        let deleteAction = UITableViewRowAction.init(style: .default, title: "         ", handler: { (action, indexPath) in
            
            print("刪除")
            
            let personModel = self.arr[indexPath.row] as XYJPersonMsg
            self.deleteMsgStatus(parameters: ["id": personModel.id ?? 0,"read_flag": "3"], row: indexPath.row)
        })
        deleteAction.backgroundColor = UIColor.backgroundColor
        let cancleACtion = UITableViewRowAction.init(style: .default, title: "         ", handler: { (action, indexPath) in
            print("取消")
            tableView.reloadData()
        })
        cancleACtion.backgroundColor = UIColor.backgroundColor
        return [deleteAction, cancleACtion]
    }
  • UITextField的循環(huán)監(jiān)聽

  1. 場(chǎng)景描述: UITextField一開始不能輸入偶垮,當(dāng)UITextField賦值后张咳,可以改變UITextField的內(nèi)容

主要實(shí)現(xiàn)如下:

設(shè)置UITextField的enable為false
首先將UITextField的text綁定到VM的textValue上。

當(dāng)設(shè)置UITextField的text的值得時(shí)候似舵,再設(shè)置textValue的值

// 主要代碼代碼如下
realNameView.cardField.field.rx.text.orEmpty.asObservable().bind(to: vm.IDCardNumValue).disposed(by: disposeBag)

self.realNameView.cardField.field.rx.text.orEmpty.asObservable().bind(to: self.vm.IDCardNumValue).disposed(by: self.disposeBag)

self.vm.IDCardNumValue.asObservable().subscribe(onNext: { (idno) in
    self.realNameView.cardField.field.text = idno
}).disposed(by: self.disposeBag)
                
self.vm.IDCardNumValue.value = idno

這樣會(huì)出現(xiàn)當(dāng)你賦值完后脚猾,再輸入的時(shí)候會(huì)出現(xiàn)輸一個(gè)值,UITestField里面會(huì)出現(xiàn)幾個(gè)相同的值砚哗,比如龙助。輸入一個(gè)a,UITestField里面會(huì)出現(xiàn)好多個(gè)a

改進(jìn):

設(shè)置UITextField的enable為false
首先將UITextField的text綁定到VM的textValue上。
監(jiān)聽textValue并設(shè)置UITextField的text的值得時(shí)候提鸟,再設(shè)置textValue的值
// 主要代碼如下
realNameView.cardField.field.rx.text.orEmpty.asObservable().bind(to: vm.IDCardNumValue).disposed(by: disposeBag)

self.realNameView.cardField.field.rx.text.orEmpty.asObservable().bind(to: self.vm.IDCardNumValue).disposed(by: self.disposeBag)

self.vm.IDCardNumValue.asObservable().take(2).subscribe(onNext: { (idno) in
    self.realNameView.cardField.field.text = idno
}).disposed(by: self.disposeBag)
                
self.vm.IDCardNumValue.value = idno
  • 按鈕的多次監(jiān)聽

  1. 場(chǎng)景描述: UI界面的View會(huì)刷新(創(chuàng)建->移除->重新創(chuàng)建)军援,在這個(gè)過程中,按鈕的點(diǎn)擊事件會(huì)多次綁定到vm上称勋。當(dāng)綁定了幾次之后胸哥,再點(diǎn)擊按鈕的時(shí)候,就會(huì)連續(xù)發(fā)出好幾個(gè)點(diǎn)擊事件
// 設(shè)置表單數(shù)據(jù)赡鲜,以及表單中事件綁定
    func setSubmitForm(loginFields: [XYJMobilSuanhuaLoginField]) {
        self.loginView.logFieldDatas = loginFields
        // 設(shè)置手機(jī)號(hào)碼
        loginFields.forEach({ (loginField) in
            if loginField.name == "phoneNo" {
                self.vm.phoneNo.value = loginField.value ?? ""
            }
        })
        
        self.btnTapbind()
        
        self.countdown()
        
        // 確定登錄類型后再進(jìn)行按鈕高亮處理
        self.vm.authenBtnBind()
        
        self.formFieldbind()
        
        // 提交按鈕高亮綁定(要在 authenBtnBind()后空厌,再設(shè)置)
        self.vm.authenBtnEnable?.asObservable().bind(to: self.loginView.submitBtn.rx.enabled).disposed(by: self.vm.disposeBag!)
        self.loginView.submitBtn.rx.tap.bind(to: self.vm.authenBtnTap!).disposed(by: self.vm.disposeBag!)
        self.vm.authenTapResult?.subscribe(onNext: { (formResult) in
            let result = self.detailForm(result: formResult)
            if result.0 {
                self.submitform(parameters: result.1)
            }
        }).disposed(by: self.vm.disposeBag!)
    }

改進(jìn):

在按鈕創(chuàng)建,按鈕點(diǎn)擊事件綁定前银酬,先把前一次綁定的資源釋放
// 代碼如下
// 設(shè)置表單數(shù)據(jù)嘲更,以及表單中事件綁定
    func setSubmitForm(loginFields: [XYJMobilSuanhuaLoginField]) {
        self.loginView.logFieldDatas = loginFields
        // 設(shè)置手機(jī)號(hào)碼
        loginFields.forEach({ (loginField) in
            if loginField.name == "phoneNo" {
                self.vm.phoneNo.value = loginField.value ?? ""
            }
        })
        
        self.btnTapbind()
        
        self.countdown()
        
        // 確定登錄類型后再進(jìn)行按鈕高亮處理
        self.vm.authenBtnBind()
        
        self.formFieldbind()
        // 資源釋放變量也重新創(chuàng)建
        self.vm.disposeBag = DisposeBag()
        
        // 提交按鈕高亮綁定(要在 authenBtnBind()后,再設(shè)置)
        self.vm.authenBtnEnable?.asObservable().bind(to: self.loginView.submitBtn.rx.enabled).disposed(by: self.vm.disposeBag!)
        self.loginView.submitBtn.rx.tap.bind(to: self.vm.authenBtnTap!).disposed(by: self.vm.disposeBag!)
        self.vm.authenTapResult?.subscribe(onNext: { (formResult) in
            let result = self.detailForm(result: formResult)
            if result.0 {
                self.submitform(parameters: result.1)
            }
        }).disposed(by: self.vm.disposeBag!)
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末揩瞪,一起剝皮案震驚了整個(gè)濱河市赋朦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌李破,老刑警劉巖北发,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異喷屋,居然都是意外死亡琳拨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門屯曹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狱庇,“玉大人,你說(shuō)我怎么就攤上這事恶耽∶苋危” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵偷俭,是天一觀的道長(zhǎng)浪讳。 經(jīng)常有香客問我,道長(zhǎng)涌萤,這世上最難降的妖魔是什么淹遵? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮负溪,結(jié)果婚禮上透揣,老公的妹妹穿的比我還像新娘。我一直安慰自己川抡,他們只是感情好辐真,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般侍咱。 火紅的嫁衣襯著肌膚如雪耐床。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天楔脯,我揣著相機(jī)與錄音咙咽,去河邊找鬼。 笑死淤年,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜡豹。 我是一名探鬼主播麸粮,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼镜廉!你這毒婦竟也來(lái)了弄诲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤娇唯,失蹤者是張志新(化名)和其女友劉穎齐遵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塔插,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梗摇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了想许。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伶授。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖流纹,靈堂內(nèi)的尸體忽然破棺而出糜烹,到底是詐尸還是另有隱情,我是刑警寧澤漱凝,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布疮蹦,位于F島的核電站,受9級(jí)特大地震影響茸炒,放射性物質(zhì)發(fā)生泄漏愕乎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一壁公、第九天 我趴在偏房一處隱蔽的房頂上張望妆毕。 院中可真熱鬧,春花似錦贮尖、人聲如沸笛粘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)薪前。三九已至润努,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間示括,已是汗流浹背铺浇。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垛膝,地道東北人鳍侣。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像吼拥,于是被迫代替她去往敵國(guó)和親倚聚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)凿可、插件惑折、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,123評(píng)論 4 61
  • 今天和老公吵架了,孩子才33天枯跑,婆婆回家第二天惨驶,我們的生活就出現(xiàn)在這次大的摩擦,起因是他做魚湯時(shí)顧著看電視把湯燉糊...
    花間疏籬閱讀 325評(píng)論 1 0
  • 昨晚到黃山已經(jīng)是半夜一點(diǎn)了敛助,早上起來(lái)天空下起雨來(lái) 粗卜,看著雨越下越大,幾個(gè)同學(xué)動(dòng)搖了纳击,去休建?不去? 看著遠(yuǎn)到而來(lái)的兩個(gè)...
    九道智慧慧畫閱讀 317評(píng)論 4 1
  • 一 導(dǎo)語(yǔ) Good evening!大家晚上好 Oxford Reading TreeStage 1百匆,牛津閱讀數(shù)系...
    快樂流利說(shuō)英語(yǔ)閱讀 1,672評(píng)論 0 0
  • 其實(shí)也沒什么砌些,就是想發(fā)一發(fā)長(zhǎng)文。 連續(xù)幾天做了些奇奇怪怪的夢(mèng)加匈,夢(mèng)里出現(xiàn)了認(rèn)識(shí)的不認(rèn)識(shí)的人存璃,夢(mèng)里不安無(wú)助哭泣。每每發(fā)...
    老藝術(shù)家Miky閱讀 219評(píng)論 0 0