RxSwift 中监听对象属性改变的方式小结:rx_observe, PublishSubject 和 Variable
2016-08-21 00:52
896 查看
日常开发中,我们经常都要去观察一个对象属性的改变,那么我们怎么去监听它比较好呢?
我们的选择还是蛮多的,不过这里我们仅讨论
我们首先就会发现
我是很不喜欢这个方案的,因为它严重依赖属性名字的字符串,这是很不安全的做法,比较容易写错,变量更名的时候也很头疼。如果不是监听我们不能改变的代码,建议不要用这个方案。
如果您也用过
配合
这个方案比上一个方案好多了,没有硬编码的字符串(属性名),但似乎看起来很啰嗦(确实也是如此)。
其实
显然这是我最喜欢的方案,示例中的
我们的选择还是蛮多的,不过这里我们仅讨论
RxSwift世界中的方案。
rx_observe
我们首先就会发现 rx_observe这个方法,然后写出类似下面的代码:
viewModel .rx_observe(Int.self, "intVar") .subscribeNext { [weak self] (value) in } .addDisposableTo(disposeBag)
我是很不喜欢这个方案的,因为它严重依赖属性名字的字符串,这是很不安全的做法,比较容易写错,变量更名的时候也很头疼。如果不是监听我们不能改变的代码,建议不要用这个方案。
PublishSubject
如果您也用过 ReactiveCocoa,桥接过非
RAC世界的东西到
RAC世界,那么您一定知道
Subject,显然
RxSwift中也有
Subject.
配合
Swift的
didSet,我们可以写出如下代码:
var intVar: Int { didSet { _rx_intVar.onNext(intVar) } } var rx_intVar: Observable<Int> { return _rx_intVar.asObservable() } private var _rx_intVar = PublishSubject<Int>()
这个方案比上一个方案好多了,没有硬编码的字符串(属性名),但似乎看起来很啰嗦(确实也是如此)。
Variable
其实 RxSwift还给了我们一个方便的方案,那就是
Variable,我们来看看怎么写:
var rx_intVar: Variable<Int> = Variable(0) var intVar: Int { get { return rx_intVar.value } set { rx_intVar.value = newValue } }
显然这是我最喜欢的方案,示例中的
intVar在外界看起来跟没有用
RxSwift的时候没有什么差别,同时我们还能通过
rx_intVar监听它的变化,又没有硬编码字符串依赖。
相关文章推荐
- JS监听对象属性改变
- iOS 监听控件某个属性的改变observeValueForKeyPath
- 17.swift怎么监听该属性的改变
- KVC 监听某对象属性值的改变
- Swift——监听属性的改变
- swift中提供属性监听器,可以监听属性的改变
- CCActionTween(可以时间上连续的改变某个对象指定key对应的属性 改变方式需要自定义 cocos2dx未定义 )
- JavaScript中通过数组索引方式访问和属性名方式访问对象属性的一个小小误区
- (5) 编码剖析Spring装配基本属性的原理【附加:注入依赖对象的两种方式】
- 如何在程序运行中动态改变对象属性在PropertyGrid可见性和只读属性
- window.open 和 window.showModelDialog 获取父窗口对象或属性的方式
- js对象属性名书写方式
- JavaScript中常见的几种创建对象的方式:基于对象扩充属性和方法、基于工厂方式创建对象、基于构造函数和基于原型
- 如何在程序运行中动态改变对象属性在PropertyGrid可见性和只读属性
- JavaScript为对象原型prototype添加属性的两种方式
- JavaScript常用对象的方法和属性小结
- JavaScript为对象原型prototype添加属性的两种方式
- 改变获取对象方式 万能的jQuery选择器
- js创建对象的几种常用方式小结(推荐)
- 基础知识提问:关于HashTable和List两个容器Add改变了属性的同一对象的问题