rxswift近期使用总结
- 先说坑吧
- 1
let typechange = Observable.just(task.type)
typechange.subscribe(onNext: {
print($0)
}).disposed(by: self.disposebag)
- 2
let typechange = Observable.just(task.type)
typechange.subscribe(print($0) ).disposed(by: self.disposebag)
方式一和二是完全不相同的方式一是正常的当task.type 产生时就直接变化了序列中 subscribe中只会有一次,但是第二种方式貌似不是这样的会多一次nil的信号最终都会跑一次
- 3
rx的使用心得开始不太熟悉这一套操作,先描述一个情景
对于多任务的数组管理,我们往往会抽象出一个实例化来管理,比如说一个task数组 中有很多person 其中一个界面会展示所有 person的姓名,但是person如果都有几个状态,我们认为,假定有已死 存活 失联的状态 当我们数组发生改变时会特定通知(要么代理 要么通知 要么block , 要么写监听)当前界面才能及时刷新, 不是说这种方式有什么不好的,我们都知道现在的主流开发都是基于驱动数据编程的,我们都希望我们的数据在那 它变那么我们的其它视图也好什么的都能同一变了这就是Vm最核心体现出来的价值//虽然他让这些变得不太好调试但是你照着规则走就是OK的,体现在编程中的情形就是 全局里有个任务的数组,你会经过一些交互让数组中的对象保持交互后的最新状态同时其它界面需要做出相应变化那么rx或许是真的让你避免写传统的通知监听代理闭包,它使用起来或许是这样的
struct Person { var name:String! var status:Int! init(_ name:String) { status = 0 self.name = name } }
class VmPerson: NSObject { static var shareps:VmPerson = VmPerson() var p:Variable<[Person]>! func bind(p:[Person]) { self.p = Variable(p) } func updatevalue(index:Int,new:Person){ if p != nil { if index >= 0 && index < self.p.value.count { self.p.value[index] = new } } } }
使用的时候
// var aboresult = VmPerson.shareps let v1 = Person("哼哼哼") let v2 = Person( "老太婆") let v3 = Person( "蓝泽哇") aboresult.bind(p: [v1,v2,v3]) self.aboresult.p.asObservable().bind(to: self.tableView.rx.items){ (tableview,item,task) in let cell = self.tableView.dequeueReusableCell(withIdentifier: "TaskCell") if task.status == 1 { cell?.textLabel?.text = "状态改变了" } else{ cell?.textLabel?.text = task.name } return cell! }.disposed(by: self.disposeBag)
//到此完毕 以后需要更新的
更改 aboresult.p.value 即可 内部的数据改掉界面会马上是新的状态,确实是帮我们做了很多事
3.driver 比variable 更强大的特性
它不会发射出错误(Error)事件
对它的观察订阅是发生在主线程(UI线程)的
自带shareReplayLatestWhileConnected
想不想像demo中那样使用
varible 和observerble对象可以采用bindto的方式
driver 对象可以采用driver的方式
它可以做的事是什么???? 看我把你抠出来
描述个情景我有一个类对象比如人它有名字,当这个名字变化时我希望有其它的对象来知道这个变化及时的刷新自己的状态就是这么简单,varible和driver包裹的对象,在数据变化的时候能刺激并相应相关的函数
实现方式很简单想要的控件扩展一个就OK了
var rx_loginEnable: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self, binding: { (button, bool) in
self.enabled = bool
if bool {
button.backgroundColor = UIColor.greenColor()
}else{
button.backgroundColor = UIColor.redColor()
}
}).asObserver()
}}
类似这样用起来就可以这样了
let driverperson = Driver<Person("和咯")>
driverperson.driver(btn.rx_loginEnable).adddisposebag(dispbag)
网友评论