iOS開發--Swift RAC響應式編程初探

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

  

相關文章
相關標籤/搜索