Swift-ReactiveCocoa3.0(二)SignalProducer 2
来源:互联网 发布:投资入门知乎 编辑:程序博客网 时间:2024/06/08 08:22
- lift
func lift<U, F>(transform: Signal<T, E> -> Signal<U, F>) -> SignalProducer<U, F>
运算符 |> 内部也是调用了lift方法,作用是把原producer的结果transform完返回新的类型(或原类型)/值,再封装成新的producer返回。
filter、map方法等就是使用这个。
自定义:
//属性let age = MutableProperty<String>("0")//自定义的方法let stringAsInt: Signal<String, NoError> -> Signal<Int, NoError> = { signal in return Signal { sink in signal.observe(error: { sendError(sink, $0) }, completed: { sendCompleted(sink) }, interrupted: { sendInterrupted(sink) }, next: { str in sendNext(sink, (str as NSString).integerValue) }) return nil } }//调用self.age.producer.lift(stringAsInt).start(next: { println("Int: \($0)") })//效果相等于self.age.producer |> stringAsInt |> start(next: { println("Int: \($0)") })
- concat
func concat<T, E>(next: SignalProducer<T, E>) -> SignalProducer<T, E> -> SignalProducer<T, E>
连接两个Producer,只有第一个producer销毁后才响应第二个producer。
例子:
//新建两个producer,和观察者sinklet (producer1, sink1) = SignalProducer<String, NoError>.buffer(1)let (producer2, sink2) = SignalProducer<String, NoError>.buffer(1)//连接两个producer producer1 |> concat(producer2) |> start(next: { println("-> \($0)") })sendNext(sink1, "I'm first producer")//打印 -> I'm first producersendNext(sink1, "I'm first producer")//打印 -> I'm first producersendNext(sink2, "I'm second producer")//此处不会打印,因为producer1未销毁sendCompleted(sink1)//通知producer1已完成并销毁sendNext(sink2, "I'm second producer")//打印 -> I'm second producersendNext(sink1, "I'm Parent")//不打印,因为producer1已销毁
- then
func then<T, U, E>(replacement: SignalProducer<U, E>) -> SignalProducer<T, E> -> SignalProducer<U, E>
作用跟concat差不多,但不会接收第一个producer的next事件。只有在第一个producer销毁后才会响应第二个producer。
例子:
//登录信号let (logInSignal, sink1) = SignalProducer<String, NoError>.buffer(1)//监控登陆状态信号let (monitorLogInStatusSignal, sink2) = SignalProducer<String, NoError>.buffer(1)logInSignal |> on(next: { /*保存登陆信息*/ }) |> then(monitorLogInStatusSignal)//这里并不关心登陆后的用户id,所以用then |> start(next: { println("-> \($0)") })sendNext(sink1, "Prepare Login...")//不打印,因为不响应第一个producersendNext(sink2, "login")//不打印,因为第一个producer未completedsendCompleted(sink1)//通知登陆完成sendNext(sink2, "login")//打印 -> login sendNext(sink2, "logout")//打印 -> logout
- combineLatestWith
func combineLatestWith<T, U, E>(otherSignalProducer: SignalProducer<U, E>) -> SignalProducer<T, E> -> SignalProducer<(T, U), E>
组合两个信号,当两个都sendNext后才会返回。
之后,每当其中一个再sendNext,都会在next回调
- zipWith
func zipWith<T, U, E>(otherSignalProducer: SignalProducer<U, E>) -> SignalProducer<T, E> -> SignalProducer<(T, U), E>
压缩两个信号,每当两个都sendNext一次才回在next回调一次。
例子:
let (producer1, sink1) = SignalProducer<String, NSError>.buffer(1) let (producer2, sink2) = SignalProducer<String, NSError>.buffer(1)producer1 |> zipWith(producer2) |> start(next: { args in println("-> :\(args.0)") println("-> :\(args.1)") })sendNext(sink1, "Producer1 say hello world") //这里不打印,必须两个信号都sendNextsendNext(sink2, "Producer2 say hello world")//打印sendNext(sink1, "Producer1 say hello world again")//这里不打印,必须两个信号都sendNextsendNext(sink2, "Producer2 say hello world again")//打印
- sampleOn
func sampleOn<T, E>(sampler: SignalProducer<(), NoError>) -> SignalProducer<T, E> -> SignalProducer<T, E>
producer1 |> sampleOn( SignalProducer<(), NoError> { sink, disposable in /******* Sample *******/ sendNext(sink, ())})
采样,当sampleOn的信号sendNext一次,就取一次producer1的最新一次sendNext的值进行next回调
- takeUntil
|> takeUntil
当传入takeUntil的信号sendNext或、sendCompleted后,将原信号设为completed。
- takeUntilReplacement
func takeUntilReplacement<T, E>(replacement: Signal<T, E>) -> Signal<T, E> -> Signal<T, E>
返回的信号会响应Next、Error、Interrupted事件。
当传入takeUntilReplacement的信号状态发生任何改变(next、error、completed等)都会disposa返回的信号
0 0
- Swift-ReactiveCocoa3.0(二)SignalProducer 2
- Swift-ReactiveCocoa3.0(二)SignalProducer
- Swift-ReactiveCocoa3.0(一)Signal
- ReactiveCocoa-Swift部分入门指南-SignalProducer
- Swift--数组(二)
- Swift(二)
- Swift基础知识(二)
- Swift入门(二)
- Swift教程(二)
- Swift学习(二)
- Swift初级(二)
- swift UITableView(二)
- Swift基础(二)
- Swift 笔记(二)
- Swift数据类型(二)
- 【Swift初见】Swift函数(二)
- Swift专栏:Swift基础入门(二)
- Swift(二十二、协议(2))
- struts2标签<s:property value=""/> ognl和el
- POJ1569叉乘判断点在三角形内部
- web前端中的各种注释和自动刷新,自动跳转,no-cache
- 最近学习hadoop遇到的问题!虽然很小但是很恶心!同时求指教!!!
- Swift入门(三)——元组(Tuple)
- Swift-ReactiveCocoa3.0(二)SignalProducer 2
- 7-30
- Objective-C Runtime 底层机制
- HTML 标签列表(1)
- #106 (div.2) A. Business trip
- iOS基础--数据解析(XML)
- cvCanny函数中, 高低阈值自适应计算方法
- 用happen-before规则重新审视DCL
- PAT乙级 1017. A除以B