時間不是很充足, 先少說點, RAC的好處是響應式編程, 不需要自己去設置代理委托, target, 而是主要以信息流(signal), block為主, 看到這里激動吧, 它可以幫你監聽你的事件, 並通過回調(callback)的形式, 實時更新UI。 其實就是把action, 觀察者模式(kvo)加上block, 代理等封裝起來統一了接口。上面這句話等同於放屁,請別認真,那時候太菜,根本是啥也不懂,這是一種FRP編程范式,准確說也就是通過block(OC),閉包(Swift)實現了一個Monad,再深入也就是統籌學的概念了,原諒我也不是很懂,是一種將數學理論實現在了編程范式中的實際應用,希望有一天我能更加清楚函子(Fountor),單子(Monad)等概念,再寫出來給自己分析溫習。
這篇文章就不太針對RAC事件流的初學者了, 希望大家有一些OC的基礎, 或者看過OC的應用卻苦於找不到Swift宏接口的同學, 我的博客一般都是針對OC轉Swift的開發者, 所以這里就簡單的寫幾句先, 以后我再補全加上demo.
在OC中RAC使用時用的是個宏, 然后罵娘的大家都知道Swift取消了宏, 所以假如你習慣了RAC(Rx完全支持swift), 想要使用的話, 自己新建一個文件, 然后加入如下代碼就可以了.
不過吧Swift其實是不希望我們這么用的,而是如同RxJava,或者是RxJS等生成一個Observe對象來具體操作,不過這里也不再贅述了,OC用習慣了,先這么寫,嘿嘿嘿。
public struct RAC {
var target : NSObject!
var keyPath : String!
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模塊代碼。