經(jīng)過(guò)前面三篇文章的探索方仿,我們對(duì)
RxSwift
的原理有了一定的認(rèn)知户敬,正所謂所有的理論基礎(chǔ)都是為實(shí)踐作鋪墊的际长,那么今天我們就來(lái)進(jìn)行一些RxSwift
在項(xiàng)目中的實(shí)際運(yùn)用
概況
今天準(zhǔn)備了下圖中的一些UI控件
熙参,根據(jù)實(shí)際開(kāi)發(fā)中遇到的需求馍迄,使用RxSwift
完成這些需求
需求一
出生日期不能超過(guò)今天福也,否則UIDatePicker的邊框變色
分析:
- 1.出生日期是一個(gè)日期,那么觀察的對(duì)象就是一個(gè)日期
date
- 2.不能超過(guò)今天攀圈,那么需要一個(gè)涮選條件判斷是否選擇的日期超過(guò)今天
- 3.如果超過(guò)今天那么
UIDatePicker
邊框變顏色暴凑,這里需要一個(gè)映射,超過(guò)是一種顏色赘来,沒(méi)超過(guò)是一種顏色
代碼如下:
//出生日期不能超過(guò)今天搬设,否則邊框變色
let birthdayOb = birthdayPicker.rx.date
.map{NSObject.isValidDate(date: $0)} //判斷日期是否超過(guò)今天
birthdayOb.map{$0 ? UIColor.red: UIColor.clear} //超過(guò)今天返回紅色,沒(méi)超過(guò)則無(wú)色
.subscribe { color in
self.birthdayPicker.layer.borderColor = color.cgColor
}
.disposed(by: disposeBag)
//日期是否小于當(dāng)天
class func isValidDate(date: Date) -> Bool {
let calendar = NSCalendar.current
let compare = calendar.compare(date, to: Date.init(), toGranularity: .day)
return compare == .orderedDescending
}
這里的map
函數(shù)是一個(gè)高階函數(shù)撕捍,再后面的文章中拿穴,會(huì)再去探索高階函數(shù)的,這里它就是把一個(gè)序列映射成另一個(gè)序列
需求二
- 性別選擇
分析:
- 1.性別選擇忧风,兩個(gè)按鈕的單項(xiàng)選擇默色,那么邏輯處理在一起沒(méi)必要單獨(dú)處理
- 2.我們觀察的是性別,那么需要?jiǎng)?chuàng)建一個(gè)性別的序列
- 3.
male
處于選中狀態(tài)狮腿,那么female
則是非選中狀態(tài) - 4.按鈕是通過(guò)點(diǎn)擊來(lái)改變狀態(tài)的
代碼如下:
//性別選擇
let genderSeleteOb = BehaviorRelay<MGGender>(value: .notSelected)
maleBtn.rx.tap
.map{MGGender.male} //男 序列
.bind(to: genderSeleteOb) //綁定自定義序列
.disposed(by: disposeBag)
femaleBtn.rx.tap
.map {MGGender.female} //女 序列
.bind(to: genderSeleteOb) //綁定自定義序列
.disposed(by: disposeBag)
genderSeleteOb.subscribe { gender in
if gender == .notSelected {return}
let isMale = gender == .male
self.maleBtn.setImage(UIImage(named: isMale ? "check": "uncheck"), for: .normal)
self.femaleBtn.setImage(UIImage(named: isMale ? "uncheck": "check"), for: .normal)
}
.disposed(by: disposeBag)
BehaviorRelay
帶默認(rèn)值的序列腿宰,也是一個(gè)高階函數(shù),在后面的文章中會(huì)有介紹
需求三
- 更新按鈕的是否可點(diǎn)擊缘厢,當(dāng)上面的日期選擇不違規(guī)且性別已經(jīng)選擇的情況下吃度,更新按鈕為可點(diǎn)擊狀態(tài),否則不可點(diǎn)擊
分析
1.性別序列已經(jīng)生日序列需要綁定在一起
代碼如下
let genderSelOB = genderSeleteOb.map {$0 != .notSelected}
Observable.combineLatest(birthdayOb, genderSelOB) { !$0 && $1 }
.bind(to: updateBtn.rx.isEnabled)
.disposed(by: disposeBag)
combineLatest
高階函數(shù)
需求四
- 1.
UISwitch
控件打開(kāi)時(shí)贴硫,UISlider
設(shè)置在1/4處椿每,否在位0 - 2.當(dāng)
Swift
掌握程度不為0時(shí)伊者,Swift
switch按鈕打開(kāi),否則關(guān)閉
/**
對(duì)UISwitch來(lái)說(shuō):
當(dāng)UISwitch為OFF時(shí)间护,表示用戶不了解Swift亦渗,因此,下面的UISlider應(yīng)該為0汁尺;
當(dāng)UISwitch為ON時(shí)法精,可以默認(rèn)把UISlider設(shè)置在1/4的位置,表示大致了解痴突;
對(duì)于UISlider來(lái)說(shuō):
當(dāng)UISlider不為0時(shí)搂蜓,應(yīng)該自動(dòng)把UISwitch設(shè)置為ON;
當(dāng)UISlider為0時(shí)辽装,應(yīng)該自動(dòng)把UISwitch設(shè)置為OFF帮碰;
*/
knowSwiftSwitch.rx.value.map {$0 ? 0.25 : 0}
.bind(to: swiftLevelSlider.rx.value)
.disposed(by: disposeBag)
swiftLevelSlider.rx.value.map {$0 > 0 ? true : false}
.bind(to: knowSwiftSwitch.rx.value)
.disposed(by: disposeBag)
需求五
- 熱衷程度控制下面愛(ài)心的大小
//愛(ài)心大小
passionToLearnStepper.rx.value.skip(1)
.subscribe { value in
UIView .animate(withDuration: 1) {
self.heartHeightConstraint.constant = value * 10
self.view.layoutIfNeeded()
}
}
.disposed(by: disposeBag)
說(shuō)時(shí)遲那時(shí)快,今天的
RxSwift
簡(jiǎn)單實(shí)戰(zhàn)就介紹到這里啦如迟。小伙伴們可以在項(xiàng)目中趕快用起來(lái)吧。別忘了手里的小星星哦~~~~