快捷搜索:
来自 计算机编程 2019-06-20 13:25 的文章
当前位置: 67677新澳门手机版 > 计算机编程 > 正文

ReactiveCocoa(II)

RAC类关系图:

图片 1


 

RAC类关系图:

图片 2


 

RAC 信号源:

图片 3


RAC 信号源:

图片 4


 需要导入的头文件:

1 import ReactiveCocoa
2 import Result
3 import ReactiveSwift

 

 需要导入的头文件:

1 import ReactiveCocoa
2 import Result
3 import ReactiveSwift

 

冷信号

 1  //1.冷信号
 2         let producer = SignalProducer<String, NoError>.init { (observer, _) in
 3             print("新的订阅,启动操作")
 4             observer.send(value: "Hello")
 5             observer.send(value: "World")
 6             observer.sendCompleted()
 7         }
 8         
 9         //创建观察者 (多个观察者观察会有副作用)
10         let sub1 = Signal<String, NoError>.Observer(value: { (value) in
11             print("观察者1接受信号(value)")
12         })
13         
14         let sub2 = Signal<String, NoError>.Observer(value: { (value) in
15             print("观察者2接受信号(value)")
16         })
17         //观察者订阅信号
18         print("观察者1订阅信号")
19         producer.start(sub1)
20         print("观察者2订阅信号")
21         producer.start(sub2)

结果:

图片 5


 

冷信号

 1  //1.冷信号
 2         let producer = SignalProducer<String, NoError>.init { (observer, _) in
 3             print("新的订阅,启动操作")
 4             observer.send(value: "Hello")
 5             observer.send(value: "World")
 6             observer.sendCompleted()
 7         }
 8         
 9         //创建观察者 (多个观察者观察会有副作用)
10         let sub1 = Signal<String, NoError>.Observer(value: { (value) in
11             print("观察者1接受信号(value)")
12         })
13         
14         let sub2 = Signal<String, NoError>.Observer(value: { (value) in
15             print("观察者2接受信号(value)")
16         })
17         //观察者订阅信号
18         print("观察者1订阅信号")
19         producer.start(sub1)
20         print("观察者2订阅信号")
21         producer.start(sub2)

结果:

图片 6


 

热信号

 1 //        热信号 (通过管道创建)
 2         let (signalA, observerA) = Signal<String, NoError>.pipe()
 3         let (signalB, observerB) = Signal<Int, NoError>.pipe()
 4         
 5         Signal.combineLatest(signalA,signalB).observeValues { (value) in
 6             print("两个热信号收到的值(value.0)   (value.1)")
 7         }
 8         //订阅信号要在send之前
 9         signalA.observeValues { (value) in
10             print("signalA : (value)")
11         }
12         
13         observerA.send(value: "sssss")
14         //        observerA.sendCompleted()
15         observerB.send(value: 2)
16         //        observerB.sendCompleted()
17         
18         observerB.send(value: 100)
19         //不sendCompleted和sendError 热信号一直激活
20         //        observerB.sendCompleted()

结果: 图片 7 


 

热信号

 1 //        热信号 (通过管道创建)
 2         let (signalA, observerA) = Signal<String, NoError>.pipe()
 3         let (signalB, observerB) = Signal<Int, NoError>.pipe()
 4         
 5         Signal.combineLatest(signalA,signalB).observeValues { (value) in
 6             print("两个热信号收到的值(value.0)   (value.1)")
 7         }
 8         //订阅信号要在send之前
 9         signalA.observeValues { (value) in
10             print("signalA : (value)")
11         }
12         
13         observerA.send(value: "sssss")
14         //        observerA.sendCompleted()
15         observerB.send(value: 2)
16         //        observerB.sendCompleted()
17         
18         observerB.send(value: 100)
19         //不sendCompleted和sendError 热信号一直激活
20         //        observerB.sendCompleted()

结果: 图片 8 


 

文本框监听

1 func racsTest() {
2         textField.reactive.continuousTextValues.observeValues { (text) in
3             
4             print("值为:(text ?? "")")
5             
6         }
7     }

 

结果:

图片 9


 

文本框监听

1 func racsTest() {
2         textField.reactive.continuousTextValues.observeValues { (text) in
3             
4             print("值为:(text ?? "")")
5             
6         }
7     }

 

结果:

图片 10


 

Map映射 用于将一个事件流的值操作后的结果产生一个新的事件流。

方法一:

textField.reactive.continuousTextValues.map { (text) -> Int in

            return (text?.count)!//!.characters.count

            }.observeValues { (count) in

                print("数值为:(count)")

        }

输入: Hello123

结果为:

图片 11

 

方法二:

 1 let (signal, observer) = Signal<String, NoError>.pipe()
 2         signal.map { (string) -> Int in
 3             return string.lengthOfBytes(using: .utf8)
 4             }.observeValues { (length) in
 5                 print("长度length: (length)")
 6         }
 7         
 8         observer.send(value: "123456")
 9         
10         observer.send(value: "some")

结果为:

图片 12


 

Map映射 用于将一个事件流的值操作后的结果产生一个新的事件流。

方法一:

textField.reactive.continuousTextValues.map { (text) -> Int in

            return (text?.count)!//!.characters.count

            }.observeValues { (count) in

                print("数值为:(count)")

        }

输入: Hello123

结果为:

图片 13

 

方法二:

 1 let (signal, observer) = Signal<String, NoError>.pipe()
 2         signal.map { (string) -> Int in
 3             return string.lengthOfBytes(using: .utf8)
 4             }.observeValues { (length) in
 5                 print("长度length: (length)")
 6         }
 7         
 8         observer.send(value: "123456")
 9         
10         observer.send(value: "some")

结果为:

图片 14


 

Filter函数可以按照之前预设的条件过滤掉不满足的值

方法一:

1 textField.reactive.continuousTextValues.filter { (text) -> Bool in
2             
3             return text!.characters.count > 3
4             
5             }.observeValues { (text) in
6                 
7                 print(text ?? "")
8                 
9         }

输入: 1234

结果:

1234 

 

方法二:

 1 let (signal, observer) = Signal<Int, NoError>.pipe()
 2         signal.filter { (value) -> Bool in
 3             return value % 2 == 0
 4             }.observeValues { (value) in
 5                 print("(value)能被2整除")
 6         }
 7         observer.send(value: 3)
 8         observer.send(value: 4)
 9         observer.send(value: 6)
10         observer.send(value: 7)

 

结果:

4能被2整除

6能被2整除


 

Filter函数可以按照之前预设的条件过滤掉不满足的值

方法一:

1 textField.reactive.continuousTextValues.filter { (text) -> Bool in
2             
3             return text!.characters.count > 3
4             
5             }.observeValues { (text) in
6                 
7                 print(text ?? "")
8                 
9         }

输入: 1234

结果:

1234 

 

方法二:

 1 let (signal, observer) = Signal<Int, NoError>.pipe()
 2         signal.filter { (value) -> Bool in
 3             return value % 2 == 0
 4             }.observeValues { (value) in
 5                 print("(value)能被2整除")
 6         }
 7         observer.send(value: 3)
 8         observer.send(value: 4)
 9         observer.send(value: 6)
10         observer.send(value: 7)

 

结果:

4能被2整除

6能被2整除


 

信号合并

合成后的新事件流只有在收到每个合成流的至少一个值后才会发送出去。接着就会把每个流的最新的值一起输出。

 1 //        信号合并 两个要被订阅combineLatest 才能被订阅,被订阅后,合并中其中一个sendNext都会激活订阅
 2         let (signalA, observerA) = Signal<String, NoError>.pipe()
 3         let (signalB, observerB) = Signal<Array<Any> , NoError>.pipe()
 4         Signal.combineLatest(signalA, signalB).observeValues { (value) in
 5             print("合并的信号:(value)")
 6         }
 7         
 8         observerA.send(value: "xxx")
 9         observerA.sendCompleted()
10         observerB.send(value: ["sdsd","ddddd"])
11         observerB.sendCompleted()

结果:

图片 15


 

信号合并

合成后的新事件流只有在收到每个合成流的至少一个值后才会发送出去。接着就会把每个流的最新的值一起输出。

 1 //        信号合并 两个要被订阅combineLatest 才能被订阅,被订阅后,合并中其中一个sendNext都会激活订阅
 2         let (signalA, observerA) = Signal<String, NoError>.pipe()
 3         let (signalB, observerB) = Signal<Array<Any> , NoError>.pipe()
 4         Signal.combineLatest(signalA, signalB).observeValues { (value) in
 5             print("合并的信号:(value)")
 6         }
 7         
 8         observerA.send(value: "xxx")
 9         observerA.sendCompleted()
10         observerB.send(value: ["sdsd","ddddd"])
11         observerB.sendCompleted()

结果:

图片 16


 

信号联合

zip中的信号都要被订阅才能激活,意味着如果是一个流的第N个元素,一定要等到另外一个流第N值也收到才会一起组合发出。 

 1 //        信号联合
 2         let (signalA, observerA) = Signal<String, NoError>.pipe()
 3         let (signalB, observerB) = Signal<String, NoError>.pipe()
 4         
 5         //两个到需要订阅 才激活zip
 6         Signal.zip(signalA, signalB).observeValues { (value) in
 7             print("zip: (value)")
 8         }
 9         
10         observerA.send(value: "1")
11 //                observerA.sendCompleted()
12         observerB.send(value: "2")
13 //                observerB.sendCompleted()
14         observerB.send(value: "cc")
15         observerA.send(value: "dd")

结果:

图片 17


 

信号联合

zip中的信号都要被订阅才能激活,意味着如果是一个流的第N个元素,一定要等到另外一个流第N值也收到才会一起组合发出。 

 1 //        信号联合
 2         let (signalA, observerA) = Signal<String, NoError>.pipe()
 3         let (signalB, observerB) = Signal<String, NoError>.pipe()
 4         
 5         //两个到需要订阅 才激活zip
 6         Signal.zip(signalA, signalB).observeValues { (value) in
 7             print("zip: (value)")
 8         }
 9         
10         observerA.send(value: "1")
11 //                observerA.sendCompleted()
12         observerB.send(value: "2")
13 //                observerB.sendCompleted()
14         observerB.send(value: "cc")
15         observerA.send(value: "dd")

结果:

图片 18


 

调度器

1    QueueScheduler.main.schedule(after: Date.init(timeIntervalSinceNow: 3)) {
2             print("主线程3秒过去了")
3         }
4         QueueScheduler.init().schedule(after: Date.init(timeIntervalSinceNow: 2)) {
5             print("子线程2秒过去了")
6         }

结果:图片 19


 

调度器

1    QueueScheduler.main.schedule(after: Date.init(timeIntervalSinceNow: 3)) {
2             print("主线程3秒过去了")
3         }
4         QueueScheduler.init().schedule(after: Date.init(timeIntervalSinceNow: 2)) {
5             print("子线程2秒过去了")
6         }

结果:图片 20


 

通知

1 //        通知
2         NotificationCenter.default.reactive.notifications(forName: Notification.Name(rawValue: "UIKeyboardWillShowNotification"), object: nil).observeValues { (notification) in
3             print("键盘弹起")
4         }
5         
6         NotificationCenter.default.reactive.notifications(forName: Notification.Name(rawValue:"UIKeyboardWillHideNotification"), object: nil).observeValues { (notification) in
7             print("键盘收起")
8         }

结果:

图片 21


 

通知

1 //        通知
2         NotificationCenter.default.reactive.notifications(forName: Notification.Name(rawValue: "UIKeyboardWillShowNotification"), object: nil).observeValues { (notification) in
3             print("键盘弹起")
4         }
5         
6         NotificationCenter.default.reactive.notifications(forName: Notification.Name(rawValue:"UIKeyboardWillHideNotification"), object: nil).observeValues { (notification) in
7             print("键盘收起")
8         }

结果:

图片 22


 

KVO 

1 let result = self.textField.reactive.producer(forKeyPath: "text")
2         result.start { (text) in
3             print("----------->(text)");
4         }

 输入:Hello

注意:输一个字符,Return 一下,否则监听不到

结果:

图片 23

 


 

KVO 

1 let result = self.textField.reactive.producer(forKeyPath: "text")
2         result.start { (text) in
3             print("----------->(text)");
4         }

 输入:Hello

注意:输一个字符,Return 一下,否则监听不到

结果:

图片 24

 


 

本文由67677新澳门手机版发布于计算机编程,转载请注明出处:ReactiveCocoa(II)

关键词: