之前项目一直用的是RAC2.5版,目前是和Swift混编,准备升级到RAC5.0版,发现RAC5.0的文档有点变态,网上看了很多关于RAC5.0的博文,给我的感觉是:“你们是在炫耀自己掌握了多么高深的编程技术了吗?专业术语一大堆、理论好几页、就是不举几个常用的例子”,所以我写了一篇更通俗易懂,5分钟就能学会的博文,希望能帮到大家。(RxSwift 完全可以取代RAC5.0)
RxSwift常用的方法大概也就这么多了,以后再有常用的方法会即时更新
个人觉得针对Swift项目来说RxSwift要比RAC5.0版本更好理解、更方便应用。RAC2.5版本更适合OC开发。混编的话建议用:RAC2.5和RxSwift3.2结合。
pod添加方式:
pod 'RxSwift', '~> 3.2.0'
pod 'RxCocoa', '~> 3.2.0'
用的时候需要导入头文件:import RxCocoa
RxSwift里面的好多方法不能自动提示的解决方案:
当敲类似textF.rx.text.s 的语法没有提示的情况下,可以敲 textF.rx.text s 就有提示了,有时候点语法不提示,应该是xcode的bug
备注:
下面的所有方法都是返回:Disposable 类型,这个类型就一个方法dispose()就是手动关闭监听,一般用不到这个返回值。但是这个库的很多方法没有添加关键字:@discardableResult ,导致调用方法的时候必须用 _ = 来接收返回值,否则有警告。
1、RxSwift - 通知的用法
.takeUntil(self.rx.deallocated).作用是:保证页面销毁的时候移除通知
// 接收通知:
_ = NotificationCenter.default.rx.notification(Notification.Name("kNotificationTestName")).takeUntil(self.rx.deallocated).subscribe(onNext: { (value) in
print(value)
})
// 发送通知:
NotificationCenter.default.post(name: Notification.Name(rawValue: "kNotificationTestName"), object: "testContent")
// 监听键盘的通知
_ = NotificationCenter.default.rx.notification(Notification.Name.UIKeyboardWillHide).takeUntil(self.rx.deallocated).subscribe(onNext: { [unowned self] (value) in
self.tableView.reloadData()
print("键盘隐藏了")
})
2、RxSwift - UITextField输入限制
// 监听UITextField的内容变化(剪切、粘贴、删除所有的内容都会触发改方法)
// subscribe方法只需要一个onNext 参数,其他的参数可以不理会(手动删除其他参数就是下面的代码的样子了)
_ = textF.rx.text.subscribe(onNext: { (text) in
print(text ?? "")
})
3、RxSwift - UIButton、SegmentedControl等点击事件
_ = btn.rx.controlEvent(UIControlEvents.touchUpInside).subscribe(onNext: { [unowned self] in
print(self.btn)
})
4、RxSwift - KVO
// 监听属性的时候(不能监听基本类型,必须转成NSNumber,并且有dynamic修饰符)
dynamic var nameStr: String = "test" // 初始化属性
// 不能用observe 否则会引起循环引用
_ = self.rx.observeWeakly(String.self, "nameStr").subscribe(onNext: { (value) in
print(value ?? "")
})
// CGRect等类型不能用observeWeakly,否则监听不到
_ = 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的用法
// 筛选符合一点条件的情况下才执行下面的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类型,实现了ControlPropertyType: ObservableType, ObserverType,所以不仅是观察者类型,还是被观察者类型
_ = self.textF.rx.text .bindTo(self.btn.rx.title(for: .normal)) // 这样文本框输入的内容就会自动设置成按钮的标题了。