RAC7.0 在Swift项目中的基本使用

 

一 、集成

Podfile文件中加入 pod 'ReactiveCocoa', '~> 7.2.0',会自动集成ReactiveCocoa,ReactiveSwift,Result三个库,导入头文件就可以使用了。

、基本用法

2.1  用户交互

       // 监听文本框输入内容
        accountTextField.reactive.continuousTextValues.observeValues { (text) in
            
            print("account\(text ?? "")")
        }
        // 监听按钮的点击事件
        loginBtn.reactive.controlEvents(.touchUpInside).observeValues { (button) in
            print("loginBtnClick")
        }

2.2  过滤

 // 当文本的内容长度大于3的时候,才想监听文本的内容
        passwordTextField.reactive.continuousTextValues.filter { (text) -> Bool in
            
            return text!.count > 3
            
            }.observeValues { (text) in
                
                print("accountfilter\(text ?? "")")
                
        }

2.3    转换

// text的值映射成text的字符数
        textField.reactive.continuousTextValues.map { (text) -> Int in
            return (text?.characters.count)!
            }.filter { (length) -> Bool in
                return length > 5
            }.observe { (length) in
                print(length)
        }

2.4  冷信号

 func getChatArray() -> SignalProducer<Any, NoError> {
        
        return SignalProducer<Any, NoError>.init { (observer, _) in
            
            self.request.GET(url: Host, paras: nil, success: { (request, response) in
                
                if let response = response {
                    self.dataArray = self.WebArray()
                    observer.send(value: response)
                    observer.sendCompleted()
                }
                
            }, failure: { (request, error) in
                
                observer.sendCompleted()
            })
            
        }
    }

// 创建信号,执行
loadDataAction = Action.init(execute: getChatArray)
        loadDataAction?.apply().start()

// observer 监听
 viewModel.loadDataAction?.events.observe({ (event) in
            
            print(event)
        })

2.5  热信号

       // 热信号
        let (signalA, observerA) = Signal<String, NoError>.pipe()
        let (signalB, observerB) = Signal<String, NoError>.pipe()
        // 联合信号
        Signal.combineLatest(signalA, signalB).observeValues { (value) in
            print( "收到的值\(value.0) + \(value.1)")
        }
        observerA.send(value: "1")
        //注意:如果加这个就是,发了一次信号就不能再发了
        observerA.sendCompleted()
        observerB.send(value: "2")
        observerB.sendCompleted()

、总结

知识点:区别冷信号和热信号

Swift中,SignalProducer 对应 RACSignal 为冷信号, Signal 对应的 RACSubject 为热信号

1.冷信号模式,是被动的,需要有人订阅才开启热信号,热信号是主动的,就算没有订阅者也会即刻推送

热信号可以有多个订阅者,一对多;冷信号只能一对一,当有新的订阅者,信号是重新完整发送的

形象的说:热信号像是直播,冷信号像是点播

2..冷信号个人用来进行网络请求,热信号进行类似代理或者通知的数据传递模式,这样就可以简单的理解为,RAC其实就是把apple的一套 delegate,Notification,KVO等一系列方法综合起来了,用起来更舒服罢了。

发布了19 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/aluoshiyi/article/details/80844895
今日推荐