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.

  在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模塊代碼。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM