传送:http://www.jianshu.com/p/07b80b326c6a 这里是MVVM篇的使用
1.折腾了一天现在也由于pods的原因导致在将RxSwift导入到项目里面老是报错,最后还是开始去用Carthage去管理项目就没有报错了,现在开始了2个月的计划记住(这里就不详细去说怎么使用Carthage的好处,真的比pods强很多,推荐使用,而且他并不与pods相互冲突,在项目里面可以同时使用)不多说了,这里就直接开始一个小的功能,获取系统当前的时间
功能大概是这样子的,按钮是一个可观察的流,对他进行了订阅,然后通过对应的逻辑代码,获取到当前的系统时间
大家看完了demo以后会发现一个神奇的效果就是并没有对应的UIButton的响应方法,可是我还是将label赋值了,获取了系统的时间,这就是RxSwift的神奇之处
//---------------------------使用subscribe-----------------------------------//
import UIKit
import RxSwift
import RxCocoa
class ViewController3: UIViewController {
@IBOutlet weak var currrentTime2: UILabel!
@IBOutlet weak var ClickBtn: UIButton!
// 垃圾回收机制
fileprivate let dispseBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
func setupUI(){
// self.ClickBtn.rx.tap说明按钮在Rxswift里面是一个可观察对象流,可以对他进行订阅
// 在订阅里面不关心button的值的话 用" _ in "
// 关心的是每次点击的时候对这个label的值得赋值
self.ClickBtn.rx.tap.subscribe({
[weak self] _ in
guard let this = self else{
return
}
// 这里的内容就是相应的逻辑,使用swift编写就ok了
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .medium
this.currrentTime2.text = dateFormatter.string(from: Date())
}).disposed(by: dispseBag)
// .disposed(by: dispseBag)将资源回收
}
}
控件的创建我就不多说了,还是原生的
fileprivate let dispseBag = DisposeBag()// 垃圾回收机器,每一次进行了订阅操作以后,通过这个回收资源,
.disposed(by: dispseBag)// 这里就是将资源进行了回收,基本上每次订阅以后都会有这一个操作
//---------------------------使用bind-----------------------------------//
func setupUI2(){
// self.ClickBtn.rx.tap 这一步已经获取了一个可观察对象流
// tap是void类型的 map可以将流转换成string
// .bind绑定UI
self.ClickBtn.rx.tap.map({
_ in
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .medium
return dateFormatter.string(from: Date())
}).bind(to:self.currrentTime2.rx.text).disposed(by: dispseBag)// text是一个观察者.上面的map首先变成一个string然后绑定UI,bind其实是subscibe的一种另外的写法,推荐使用
}
//---------------------------使用drive 还有 share-----------------------------------//
drive天然自带了share
extension ViewController3{
// 使用bind的写法
func setup3(){
func transform() -> String{
print("我被订阅了")
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .medium
return dateFormatter.string(from: Date())
}
let test1 = self.ClickBtn.rx.tap.map(transform)
test1.bind(to: self.currentTime1.rx.text).disposed(by: dispseBag)
test1.bind(to: self.currrentTime2.rx.text).disposed(by: dispseBag)
}
// share() 订阅的流是同一份的话,共享
func setup4(){
func transform() -> String{
print("我被订阅了")
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .medium
return dateFormatter.string(from: Date())
}
let test1 = self.ClickBtn.rx.tap.map(transform).share()
test1.bind(to: self.currentTime1.rx.text).disposed(by: dispseBag)
test1.bind(to: self.currrentTime2.rx.text).disposed(by: dispseBag)
}
// drave天然带了share()这个属性 强烈推荐UI上面
func setup5(){
func transform() -> String{
print("我被订阅了")
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .medium
return dateFormatter.string(from: Date())
}
let test1 = self.ClickBtn.rx.tap.asDriver().map(transform)
test1.drive(self.currentTime1.rx.text).disposed(by: dispseBag)
test1.drive(self.currrentTime2.rx.text).disposed(by: dispseBag)
}
// 使用driver setupUI6()方法是重写了setupUI2()使用driver
func setupUI6(){
self.ClickBtn.rx.tap.asDriver().map ({
_ in
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .medium
return dateFormatter.string(from: Date())
}).drive(self.currentTime1.rx.text).disposed(by: dispseBag)
}
}
网友评论