1.创建信号

  1. // 1.通过信号发生器创建(冷信号)
  2. let producer = SignalProducer<String, NoError>.init { (observer, _) in
  3. print("新的订阅,启动操作")
  4. observer.send(value: "Hello")
  5. observer.send(value: "World")
  6. }
  7.  
  8. let subscriber1 = Observer<String, NoError>(value: { print("观察者1接收到值 \($0)") })
  9. let subscriber2 = Observer<String, NoError>(value: { print("观察者2接收到值 \($0)") })
  10.  
  11. print("观察者1订阅信号发生器")
  12. producer.start(subscriber1)
  13. print("观察者2订阅信号发生器")
  14. producer.start(subscriber2)
  15. //注意:发生器将再次启动工作
  16.  
  17. // 2.通过管道创建(热信号)
  18. let (signalA, observerA) = Signal<String, NoError>.pipe()
  19. let (signalB, observerB) = Signal<String, NoError>.pipe()
  20. Signal.combineLatest(signalA, signalB).observeValues { (value) in
  21. print( "收到的值\(value.0) + \(value.1)")
  22. }
  23. observerA.send(value: "")
  24. //注意:如果加这个就是,发了一次信号就不能再发了
  25. observerA.sendCompleted()
  26. observerB.send(value: "")
  27. observerB.sendCompleted()
  28.  
  29. //3.创建空信号
  30. let emptySignal = Signal<Any, NoError>.empty
  31. emptySignal.observe { (value) in
  32.  
  33. }

2.基本控件用法

  1. //MARK:通知
  2. private func noti() {
  3.  
  4. NotificationCenter.default.reactive.notifications(forName: Notification.Name(rawValue: "UIKeyboardWillShowNotification"), object: nil).observeValues { (value) in
  5.  
  6. }
  7.  
  8. NotificationCenter.default.post(name: Notification.Name(rawValue: "name"), object: self)
  9. }
  10.  
  11. //MARK:KVO
  12. private func kvoWithRac() {
  13.  
  14. view.reactive.values(forKeyPath: "bounds").start { [weak self](rect) in
  15. print(self?.view ?? "")
  16. print(rect)
  17. }
  18. }
  19.  
  20. //MARK:按钮点击
  21. private func btnWithRAC() {
  22.  
  23. //1.点击
  24. btn.tag =
  25. btn.isEnabled = true
  26. btn.reactive.controlEvents(.touchUpInside).observeValues { (btn) in
  27. print("点击了按钮,颜色\(btn.tag)")
  28. }
  29. }
  30.  
  31. //textField
  32. textField.reactive.continuousTextValues.observeValues { (value) in
  33.  
  34. }

3.过滤  filter

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

4.转换 map

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

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

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

//2.

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

  1.         }
  1.  

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

  1. // 主线程上延时0.3秒调用
  2. QueueScheduler.main.schedule(after: Date.init(timeIntervalSinceNow: 0.3)) {
  3. print("主线程调用")
  4. }
  5.  
  6. QueueScheduler.init().schedule(after: Date.init(timeIntervalSinceNow: 0.3)){
  7. print("子线程调用")
  8. }

7.迭代器

  1. // 数组的迭代器
  2. let array:[String] = ["name","name2"]
  3. var arrayIterator = array.makeIterator()
  4. while let temp = arrayIterator.next() {
  5. print(temp)
  6. }
  7.  
  8. // swift 系统自带的遍历
  9. array.forEach { (value) in
  10. print(value)
  11. }
  12.  
  13. // 字典的迭代器
  14. let dict:[String: String] = ["key":"name", "key1":"name1"]
  15. var dictIterator = dict.makeIterator()
  16. while let temp = dictIterator.next() {
  17. print(temp)
  18. }
  19.  
  20. // swift 系统自带的遍历
  21. dict.forEach { (key, value) in
  22. print("\(key) + \(value)")
  23. }

8.信号联合

  1. func testZip() {
  2. let (signalA, observerA) = Signal<Any, NoError>.pipe()
  3. let (signalB, observerB) = Signal<String, NoError>.pipe()
  4.  
  5. Signal.zip(signalA, signalB).observeValues { (value) in
  6. print(value)
  7. }
  8.  
  9. signalA.zip(with: signalB).observeValues { (value) in
  10.  
  11. }
  12. observerA.send(value: "")
  13. observerA.sendCompleted()
  14. observerB.send(value: "")
  15. observerB.sendCompleted()
  16. }

9.代替delegate

  1. .
  2. import ReactiveCocoa
  3. import ReactiveSwift
  4. import Result
  5.  
  6. .let (signalTap , observerTap) = Signal<Any, NoError>.pipe()
  7. observerTap.send(value: tap)
  8. 自定义个view
  9. class LyContentView: UIView {
  10.  
  11. let (signalTap , observerTap) = Signal<Any, NoError>.pipe()
  12.  
  13. override init(frame: CGRect) {
  14. super.init(frame: frame)
  15.  
  16. setUI()
  17. }
  18.  
  19. required init?(coder aDecoder: NSCoder) {
  20. fatalError("init(coder:) has not been implemented")
  21. }
  22.  
  23. }
  24.  
  25. extension LyContentView {
  26. fileprivate func setUI() {
  27. backgroundColor = UIColor.yellow
  28.  
  29. let tap = UITapGestureRecognizer(target: self, action: #selector(self.tapClick(_:)))
  30. addGestureRecognizer(tap)
  31. }
  32.  
  33. //使用RAC,替代delegate,闭包
  34. @objc fileprivate func tapClick(_ tap : UITapGestureRecognizer) {
  35. observerTap.send(value: tap)
  36. }
  37. }
  38. .控制器中监听
  39. contentView.signalTap.observeValues { (value) in
  40. print("点击了view")
  41. }

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. python3调用微软js引擎ChakraCore

    有关ChakraCore介绍请移步:https://github.com/Microsoft/ChakraCore 使用案例GitHub源码:https://github.com/pyAppman/C ...

  2. GDI+3

    关于这个的例子其实网上已经有这方面的资料了,但是为了文章的完整性,还是觉得有必要讲解.我们先来看一下效果:     ( 图2 )接下来看看这是如何做到的. 思路:聊天窗体上有一个截图按钮,点击按钮后, ...

  3. 数论 CF27E Number With The Given Amount Of Divisors

    求因子数一定的最小数(反素数) #include<iostream> #include<string> #include<cmath> #include<cs ...

  4. Sqlserver 增删改查----改

    --我们就以院系,班级,学生来举例. create TABLE [dbo].YuanXi ( Id ,) NOT NULL,--学校id 自增量 YuanXiName varchar() null, ...

  5. junit基础学习之-简介(1)

    JUnit介绍 JUnit是一个开源的Java单元测试框架,由 Erich Gamma 和 Kent Beck 开发完成. 1  JUnit简介 JUnit主要用来帮助开发人员进行Java的单元测试, ...

  6. pytorch随笔

    pytorch中transform函数 一般用Compose把多个步骤整合到一起: 比如说 transforms.Compose([ transforms.CenterCrop(10), transf ...

  7. ES6中字符串的新增方法梳理

    1.String.fromCodePoint(); String,fromCodePoint()方法可以认为是对String.fromCharCode()方法的扩展,这两个方法的共同点在于都是用于Un ...

  8. Java连载69-接受输入、用数组模拟栈

    一.编写一个酒店管理系统 1.直接上代码 package com.bjpowernode.java_learning; ​ public class D69_1_ { //编写一个程序模拟酒店的管理系 ...

  9. springboot自动装配介绍

    所谓的自动装配,就是 autowire. 如何激活自动装配呢? 方法一:@EnableAutoConfiguration或@SpringBootApplication,写在@Configuration ...

  10. 基于仿生算法的智能系统I

    仿生算法仿生算法是什么? 什么是仿生? 蜜蜂会造房子,人类就学习蜜蜂盖房子的方法,之后便有了航空建造工程的蜂窝结构. 仿生是模仿生物系统的功能和行为,来建造技术系统的一种科学方法.生活仿生作品现代的飞 ...