一:Signal:信号(主要包含:信号观察者,信号发射器)<<<基本使用方法:>>>创建一个Signal,添加观察者,信号发射器发送信号
创建方式1:正常流程
//1:使用pipe()函数创建
let (sig, obr) = Signal<String, NoError>.pipe()
//sig:信号,可以添加观察者
//obr:信号发射器
//2.0:添加观察者:observeValues
sig.observeValues { (text) in
print("\(text)")
}
//2.1:添加观察者:observe
sig.observe { (event) in
print("\(event.value)")
}
//会接收两次事件
//3:发送数据
obr.send(value: "aaaaa")
//4:打印
aaaaa
Optional("aaaaa")
nil
创建方式2:内部添加观察者
//1:创建一个内部观察者,并返回一个信号发射器
let sig11 = Signal<String, NoError>.Observer.init { (event) in
print("\(event.value)")
}
//2:发送数据
sig11.send(value: "aaaaa")
//3:打印
Optional("aaaaa")
创建方式3:(信号绑定另一个观察者)
//1:使用pipe()函数创建
let (sig, obr) = Signal<String, NoError>.pipe()
//sig:信号,可以添加订阅
//obr:信号发射器
//2:创建信号观察者
let sig11 = Signal<String, NoError>.Observer.init { (event) in
print("222\(event.value)")
}
//3:绑定观察者
sig.observe(sig11)
//4:发送数据
obr.send(value: "aaaaa")
//5:打印
222Optional("aaaaa")
222nil
二:SignalProducer:对于Signal的封装,预先创建好信号发射器,调用用start()方法执行信号发射,适用于网络请求等场景。
1:正常创建一个SignalProducer
//1:初始化SignalProducer
let sProducer = SignalProducer<String, NoError>() { (observer, _) in
observer.send(value: "aaaaa")
print("bbbbbb")
observer.sendCompleted()
}
//observer:信号发射器,创建的时候已经定义好
//可以在里面写上网络请求代码,得到返回后调用observer.send(data)
2.0:调用start()执行
sProducer.start()
2.1:调用startWithValues()可以接收到值
sProducer.startWithValues { (text) in
print("\(text)")
}
//2.1.1:打印
aaaaa
bbbbbb
2:使用Signal作为观察者
//1:初始化SignalProducer
let sProducer = SignalProducer<String, NoError>() { (observer, _) in
observer.send(value: "aaaaa")
print("bbbbbb")
observer.sendCompleted()
}
//2:初始化一个Signal观察者(接收的是事件)
let siganle = Signal<String, NoError>.Observer() { text in
print("\(text.value)")
}
//3:发送
sProducer.start(siganle)
//4:打印
Optional("aaaaa")
bbbbbb
nil
三:combineLatest:连接信号
let (sig1, Ober1) = Signal<String, NoError>.pipe()
let (sig2, Ober2) = Signal<String, NoError>.pipe()
let sig3 = sig1.combineLatest(with: sig2).map { (a1, a2) -> Bool in
if a1 + a2 == "11" {
return true
}
return false
}
sig3.observeValues { (a) in
}
Ober1.send(value: "111111")
Ober2.send(value: "222222")
//这里sig1和sig2连接在一起,任意一个信号收到消息都会调用combineLatest闭包
//使用map映射返回一个bool类型
//一般可以监听登录界面的两个textField框,来判断登录按钮的状态
网友评论