时间不是很充足, 先少说点, RAC的好处是响应式编程, 不须要本身去设置代理委托, target, 而是主要以信息流(signal), block为主, 看到这里激动吧, 它能够帮你监听你的事件, 并经过回调(callback)的形式, 实时更新UI。 其实就是把action, 观察者模式(kvo)加上block, 代理等封装起来统一了接口。上面这句话等同于放屁,请别认真,那时候太菜,根本是啥也不懂,这是一种FRP编程范式,准确说也就是经过block(OC),闭包(Swift)实现了一个Monad,再深刻也就是统筹学的概念了,原谅我也不是很懂,是一种将数学理论实如今了编程范式中的实际应用,但愿有一天我能更加清楚函子(Fountor),单子(Monad)等概念,再写出来给本身分析温习。编程
这篇文章就不太针对RAC事件流的初学者了, 但愿你们有一些OC的基础, 或者看过OC的应用却苦于找不到Swift宏接口的同窗, 个人博客通常都是针对OC转Swift的开发者, 因此这里就简单的写几句先, 之后我再补全加上demo.swift
在OC中RAC使用时用的是个宏, 而后骂娘的你们都知道Swift取消了宏, 因此假如你习惯了RAC(Rx彻底支持swift), 想要使用的话, 本身新建一个文件, 而后加入以下代码就能够了.闭包
不过吧Swift实际上是不但愿咱们这么用的,而是如同RxJava,或者是RxJS等生成一个Observe对象来具体操做,不过这里也再也不赘述了,OC用习惯了,先这么写,嘿嘿嘿。函数
public struct RAC {spa
var target : NSObject!代理
var keyPath : String!server
var nilValue : AnyObject!对象
init(_ target: NSObject!, _ keyPath: String, nilValue: AnyObject? = nil) {接口
self.target = target事件
self.keyPath = keyPath
self.nilValue = nilValue
}
func assignSignal(signal : RACSignal) {
signal.setKeyPath(self.keyPath, onObject: self.target, nilValue: self.nilValue)
}
}
func RACObserve(target: NSObject!, keyPath: String) -> RACSignal {
return target.rac_valuesForKeyPath(keyPath, observer: target)
}
infix operator <~ {}
func <~ (rac: RAC, signal: RACSignal){
return rac.assignSignal(signal)
}
很久没写了,过来更新下,添加了过去OC版本的RACObserve宏的实现函数,又作了一个运算符重载,相信能有效解决OC转Swift同窗的疑惑,这里提一两个Swift须要注意的点,RAC同窗要注意的。
1,Swift默认是静态语言,因此对于像过去咱们要监听一个对象的特定属性,触发setter等方式都无效,不会生成对应信号,只能手动的KVC,也就是setValue(for:keyPath)函数才能够生成信号,这是极不方便的,因此请看第二条。
2,苹果容许咱们对一个对象特定的属性使用dynamic(动态)关键字进行修饰,这样当对一个值进行setter的时候就能够成功触发,貌似Swift4会为Swift增长动态特性,但愿苹果可以更加给力,至少目前而言想要写一些运行时函数仍是很是麻烦的,只能桥接OC的runtime模块代码。