之前項(xiàng)目一直用的是RAC2.5版,目前是和Swift混編阿逃,準(zhǔn)備升級到RAC5.0版逸绎,發(fā)現(xiàn)RAC5.0的文檔有點(diǎn)變態(tài),網(wǎng)上看了很多關(guān)于RAC5.0的博文淆游,給我的感覺是:“你們是在炫耀自己掌握了多么高深的編程技術(shù)了嗎傍睹?專業(yè)術(shù)語一大堆、理論好幾頁犹菱、就是不舉幾個(gè)常用的例子”拾稳,所以我寫了一篇更通俗易懂,5分鐘就能學(xué)會的博文腊脱,希望能幫到大家访得。(RxSwift 完全可以取代RAC5.0)
RxSwift常用的方法大概也就這么多了,以后再有常用的方法會即時(shí)更新
個(gè)人覺得針對Swift項(xiàng)目來說RxSwift要比RAC5.0版本更好理解陕凹、更方便應(yīng)用悍抑。RAC2.5版本更適合OC開發(fā)《虐遥混編的話建議用:RAC2.5和RxSwift3.2結(jié)合搜骡。
pod添加方式:
pod 'RxSwift', '~> 3.2.0'
pod 'RxCocoa', '~> 3.2.0'
用的時(shí)候需要導(dǎo)入頭文件:import RxCocoa
RxSwift里面的好多方法不能自動提示的解決方案:
當(dāng)敲類似textF.rx.text.s 的語法沒有提示的情況下,可以敲 textF.rx.text s 就有提示了佑女,有時(shí)候點(diǎn)語法不提示记靡,應(yīng)該是xcode的bug
備注:
下面的所有方法都是返回:Disposable 類型,這個(gè)類型就一個(gè)方法dispose()就是手動關(guān)閉監(jiān)聽团驱,一般用不到這個(gè)返回值摸吠。但是這個(gè)庫的很多方法沒有添加關(guān)鍵字:@discardableResult ,導(dǎo)致調(diào)用方法的時(shí)候必須用 _ = 來接收返回值嚎花,否則有警告寸痢。
1、RxSwift - 通知的用法
.takeUntil(self.rx.deallocated).作用是:保證頁面銷毀的時(shí)候移除通知
// 接收通知:
_ = NotificationCenter.default.rx.notification(Notification.Name("kNotificationTestName")).takeUntil(self.rx.deallocated).subscribe(onNext: { (value) in
print(value)
})
// 發(fā)送通知:
NotificationCenter.default.post(name: Notification.Name(rawValue: "kNotificationTestName"), object: "testContent")
// 監(jiān)聽鍵盤的通知
_ = NotificationCenter.default.rx.notification(Notification.Name.UIKeyboardWillHide).takeUntil(self.rx.deallocated).subscribe(onNext: { [unowned self] (value) in
self.tableView.reloadData()
print("鍵盤隱藏了")
})
2贩幻、RxSwift - UITextField輸入限制
// 監(jiān)聽UITextField的內(nèi)容變化(剪切轿腺、粘貼、刪除所有的內(nèi)容都會觸發(fā)改方法)
// subscribe方法只需要一個(gè)onNext 參數(shù)丛楚,其他的參數(shù)可以不理會(手動刪除其他參數(shù)就是下面的代碼的樣子了)
_ = textF.rx.text.subscribe(onNext: { (text) in
print(text ?? "")
})
3族壳、RxSwift - UIButton、SegmentedControl等點(diǎn)擊事件
_ = btn.rx.controlEvent(UIControlEvents.touchUpInside).subscribe(onNext: { [unowned self] in
print(self.btn)
})
4趣些、RxSwift - KVO
// 監(jiān)聽屬性的時(shí)候(不能監(jiān)聽基本類型仿荆,必須轉(zhuǎn)成NSNumber,并且有dynamic修飾符)
dynamic var nameStr: String = "test" // 初始化屬性
// 不能用observe 否則會引起循環(huán)引用
_ = self.rx.observeWeakly(String.self, "nameStr").subscribe(onNext: { (value) in
print(value ?? "")
})
// CGRect等類型不能用observeWeakly,否則監(jiān)聽不到
_ = self.textF.rx.observe(CGRect.self, "frame").subscribe(onNext: { (value) in
print("frame====\(String(describing: value))")
})
// ??? CGPoint 必須用observeWeakly拢操,否則釋放不掉
_ = self.tableView?.rx.observeWeakly(CGPoint.self, "contentOffset").subscribe(onNext: { [weak self] (value) in
print("value====\(String(describing: value))")
if let value = value {
self?.myObserverAction(newValue: value)
}
})
5锦亦、RxSwift - map的用法
// 把返回的String類型map成UIColor類型
_ = textF.rx.text.map({ (value) -> UIColor in
if let value = value , value.characters.count > 5 {
return UIColor.red
} else {
return UIColor.green
}
}).subscribe(onNext: { [unowned self] (color) in
self.textF.textColor = color
})
6、RxSwift - filter的用法
// 篩選符合一點(diǎn)條件的情況下才執(zhí)行下面的subscribe方法
_ = textF.rx.text .filter({ (value) -> Bool in
if let value = value , value.characters.count > 3 {
return true
}
return false
}).subscribe(onNext: { (text) in
print("==========\(text!)")
})
7令境、RxSwift - 綁定
//Rx的重要角色為Observable(被觀察者)和Observer(觀察者)
// 把UITextField里的文字賦值給UIButton(把被觀察者的值賦值給觀察者)
// UITextField的rx.text屬性為ControlProperty類型杠园,實(shí)現(xiàn)了ControlPropertyType: ObservableType, ObserverType,所以不僅是觀察者類型舔庶,還是被觀察者類型
_ = self.textF.rx.text .bindTo(self.btn.rx.title(for: .normal)) // 這樣文本框輸入的內(nèi)容就會自動設(shè)置成按鈕的標(biāo)題了抛蚁。