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模块代码。

  

posted @ 2016-03-05 17:53  JianweiWang  阅读(3391)  评论(0编辑  收藏  举报