1.创建信号

// 1.通过信号发生器创建(冷信号)
let producer = SignalProducer<String, NoError>.init { (observer, _) in
print("新的订阅,启动操作")
observer.send(value: "Hello")
observer.send(value: "World")
} let subscriber1 = Observer<String, NoError>(value: { print("观察者1接收到值 \($0)") })
let subscriber2 = Observer<String, NoError>(value: { print("观察者2接收到值 \($0)") }) print("观察者1订阅信号发生器")
producer.start(subscriber1)
print("观察者2订阅信号发生器")
producer.start(subscriber2)
//注意:发生器将再次启动工作 // 2.通过管道创建(热信号)
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: "")
//注意:如果加这个就是,发了一次信号就不能再发了
observerA.sendCompleted()
observerB.send(value: "")
observerB.sendCompleted() //3.创建空信号
let emptySignal = Signal<Any, NoError>.empty
emptySignal.observe { (value) in }

2.基本控件用法

//MARK:通知
private func noti() { NotificationCenter.default.reactive.notifications(forName: Notification.Name(rawValue: "UIKeyboardWillShowNotification"), object: nil).observeValues { (value) in } NotificationCenter.default.post(name: Notification.Name(rawValue: "name"), object: self)
} //MARK:KVO
private func kvoWithRac() { view.reactive.values(forKeyPath: "bounds").start { [weak self](rect) in
print(self?.view ?? "")
print(rect)
}
} //MARK:按钮点击
private func btnWithRAC() { //1.点击
btn.tag =
btn.isEnabled = true
btn.reactive.controlEvents(.touchUpInside).observeValues { (btn) in
print("点击了按钮,颜色\(btn.tag)")
}
} //textField
textField.reactive.continuousTextValues.observeValues { (value) in }

3.过滤  filter

//filter作用:过滤   当text>5才会输出
textField.reactive.continuousTextValues.filter { (text) -> Bool in return (text?.characters.count)! >
}.observe({
text in
print(text)
})

4.转换 map

//每一次map接收到的Value事件,它就会运行closure,以closure的返回值作为Value事件发送出去。上面的代码中,我们的text的值映射成text的字符数
textField.reactive.continuousTextValues.map { (text) -> Int in
return (text?.characters.count)!
}.filter { (length) -> Bool in
return length >
}.observe { (length) in
print(length)
} //(改变属性)使用map与observeValues结合改变属性
textField.reactive.continuousTextValues
.map { (text) -> Int in
return (text?.characters.count)!
}
.map { (length) -> UIColor in
return length > ? UIColor.red : UIColor.yellow
}
.observeValues { (backgroundColor) in
self.textField.backgroundColor = backgroundColor
}

5.两个信号结合使用 <~

//1.
let nameSign = textField.reactive.continuousTextValues.map { (text) -> Int in
return (text?.characters.count)!
}
let passSign = passwordtextField.reactive.continuousTextValues.map { (text) -> Int in
return (text?.characters.count)!
}
btn.reactive.isEnabled <~ Signal.combineLatest(nameSign, passSign).map({(namelength : Int, passlength : Int) -> Bool in return namelength >= && passlength >
})

//2.

Signal.combineLatest(nameSign,passSign).observeValues { (namelength : Int, passlength : Int) in

        }
 

6.Scheduler(调度器)延时加载

// 主线程上延时0.3秒调用
QueueScheduler.main.schedule(after: Date.init(timeIntervalSinceNow: 0.3)) {
print("主线程调用")
} QueueScheduler.init().schedule(after: Date.init(timeIntervalSinceNow: 0.3)){
print("子线程调用")
}

7.迭代器

// 数组的迭代器
let array:[String] = ["name","name2"]
var arrayIterator = array.makeIterator()
while let temp = arrayIterator.next() {
print(temp)
} // swift 系统自带的遍历
array.forEach { (value) in
print(value)
} // 字典的迭代器
let dict:[String: String] = ["key":"name", "key1":"name1"]
var dictIterator = dict.makeIterator()
while let temp = dictIterator.next() {
print(temp)
} // swift 系统自带的遍历
dict.forEach { (key, value) in
print("\(key) + \(value)")
}

8.信号联合

func testZip() {
let (signalA, observerA) = Signal<Any, NoError>.pipe()
let (signalB, observerB) = Signal<String, NoError>.pipe() Signal.zip(signalA, signalB).observeValues { (value) in
print(value)
} signalA.zip(with: signalB).observeValues { (value) in }
observerA.send(value: "")
observerA.sendCompleted()
observerB.send(value: "")
observerB.sendCompleted()
}

9.代替delegate

.
import ReactiveCocoa
import ReactiveSwift
import Result .let (signalTap , observerTap) = Signal<Any, NoError>.pipe()
observerTap.send(value: tap)
自定义个view
class LyContentView: UIView { let (signalTap , observerTap) = Signal<Any, NoError>.pipe() override init(frame: CGRect) {
super.init(frame: frame) setUI()
} required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
} } extension LyContentView {
fileprivate func setUI() {
backgroundColor = UIColor.yellow let tap = UITapGestureRecognizer(target: self, action: #selector(self.tapClick(_:)))
addGestureRecognizer(tap)
} //使用RAC,替代delegate,闭包
@objc fileprivate func tapClick(_ tap : UITapGestureRecognizer) {
observerTap.send(value: tap)
}
}
.控制器中监听
contentView.signalTap.observeValues { (value) in
print("点击了view")
}

Demo:https://github.com/zhangjie579/LyReactiveSwiftDemo

RAC,ReactiveSwift的更多相关文章

  1. ReactiveSwift框架

    最近项目不多,所以就研究了一下RxSwift和RAS,RAC以前项目中用过了,在这里我就先简单的介绍一下什么是RAS.总述:在RAC 5.0这个版本,有了很大的改动,API已经重新命名.在和Swift ...

  2. ReactiveSwift日常运用<一>

    上一篇中,我已经很详细的介绍了ReactiveSwift,接下来我就举几个简单的例子供大家参考.1.键盘的监听这在我们开发中很常用,因为很多App都需要对登录注册进行判断,这样可以避免服务器存储很多废 ...

  3. ReactiveObjC(RAC)的使用汇总

    RAC 指的就是 RactiveCocoa ,是 Github 的一个开源框架,能够帮我们提供大量方便的事件处理方案,让我们更简单粗暴地去处理事件,现在分为 ReactiveObjC 和 Reacti ...

  4. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  5. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 1.实施前准备工作 1.1 服务器安装操 ...

  6. 利用XAG在RAC环境下实现GoldenGate自动Failover

    概述 在RAC环境下配置OGG,要想实现RAC节点故障时,OGG能自动的failover到正常节点,要保证两点: 1. OGG的checkpoint,trail,BR文件放置在共享的集群文件系统上,R ...

  7. 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)

    集群概念介绍(一)) 白宁超 2015年7月16日 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习 ...

  8. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 3.安装Clus ...

  9. 使用SwingBench 对Oracle RAC DB性能 压力测试

    我们可以使用swingbench这个工具对数据库性能进行压力测试,得到一些性能指标作为参考. SwingBench下载: http://www.dominicgiles.com/downloads.h ...

随机推荐

  1. Web移动前端开发-——rem+less+媒体查询,rem+flexble.js+媒体查询

    实际开发搞搞起来!!!! rem适配方案 媒体查询+rem+less 基础知识铺垫 第一步,我们需要拿到设计稿,安装设计稿的要求来设置一个合适的html字体大小. 第二步,计算元素大小的取值 页面re ...

  2. 这篇干货让你在零点前完成学术Essay写作

    写论文,做研究,上课,参加课外活动,与他人social...在美国,你会有很多的事情需要你去做,如何将自己的时间平衡的分配到自己的学习生活以及私人生活中,就显得尤为重要,而这些问题也是影响中国学生的重 ...

  3. Flink 容错机制与状态

    简介 Apache Flink提供了一种容错机制,可以持续恢复数据流应用程序的状态. 该机制确保即使出现故障,经过恢复,程序的状态也会回到以前的状态. Flink 主持 at least once 语 ...

  4. 第九篇 AJAX

    AJAX 阅读目录(Content) 概述 AJAX常见应用情景 AJAX的优缺点 jQuery实现的AJAX $.ajax参数 AJAX请求如何设置csrf_token 序列化 Django内置的s ...

  5. 微信小程序 -- 自定义抽屉式菜单(底部,从下向上拉出)

    实现一个抽屉菜单的案例 wxml <!--button--> <view class="btn" bindtap="powerDrawer" ...

  6. C/C++ SQLite 之基础篇

    文章目录:                   1. 下载 SQLite3 源码: 2. 下载 SQLite3.dll 文件: 3. 生成 SQLite3.lib 文件 : 4. 生成或者下载 SQL ...

  7. 1834 [ZJOI2010]network 网络扩容

    题解:先在原网络上跑最大流,然后加上带费用的边跑费用流 高一的时候做这道题怎么想不到? 注意:maxn代表的不一定是同一个变量的范围 #include<iostream> #include ...

  8. java中的字符串String

    一.String简介d 参考:https://www.cnblogs.com/zhangyinhua/p/7689974.html String类代表字符串. java.lang.String: Ja ...

  9. 51Nod1085 0-1背包(一维和二维数组实现)

    背包是典型的动态规划问题,关于背包问题的详解,推荐博客:点击打开链接(这篇博客有点错误,代码for循环里错了,不过讲解 的很详细) 题目如下: 在N件物品取出若干件放在容量为W的背包里,每件物品的体积 ...

  10. 吴裕雄--天生自然 JAVASCRIPT开发学习:数据类型

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...