時間不是很充足, 先少說點, 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模塊代碼。