ReactiveCocoa 谈谈RACMulticastConnection
本文出处:http://www.cnblogs.com/forkasi/p/4886740.html
在项目里,经常会使用这种方式创建一个signal 然后next
RACSignal *four = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
NSLog(@"oneSignal createSignal");
[subscriber sendNext:@""];
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
NSLog(@"oneSignal dispose");
}];
}];
[four subscribeNext:^(id x) {
NSLog(@"fristSignal 1");
}];
有时候我们会想顺序操作分割业务,在原来的signal对象上再next一次
[four subscribeNext:^(id x) {
NSLog(@"fristSignal 2");
}];
看上去是没有问题的,但是一跑起来就会发现
2015-10-17 00:06:20.050 conatAndThen[4518:2969779] oneSignal createSignal
2015-10-17 00:06:20.051 conatAndThen[4518:2969779] fristSignal 1
2015-10-17 00:06:20.052 conatAndThen[4518:2969779] oneSignal dispose
2015-10-17 00:06:20.053 conatAndThen[4518:2969779] oneSignal createSignal
2015-10-17 00:06:20.053 conatAndThen[4518:2969779] fristSignal 2
2015-10-17 00:06:20.053 conatAndThen[4518:2969779] oneSignal dispose
createSignal 被调用两次,来看看这是为什么
1.createSignal传入createBlock 返回 一个RACDynamicSignal 对象
这个对象保存了didSubscrib的block
2.在subscribNext中传入nextBlock创建一个RACSubscriber对象
3.执行subscribe这个方法
在subscribe中 调用了didSubscribe
并将保存了nextBlock的RACSubscriber对象
4.如果在createBlock中调用了subsribe sendNext的话 subscribe就会调用传入的nextBlock
总的来说
我们在createBlock经常看到的id<RACSubscriber> subscriber
这个subsriber就是在subsrbeNext时创建的,每次执行subscribeNext都会调用createBlock
,这就不难理解为什么createBlock为什么会重复执行
这根本就是不同的RACSubscriber
RAC 通过RACSignal 的multicast 方法来解决这个问题
这个方法返回一个RACMulticastConnection对象 调用connect 方法后,再获取signal属性,createBlock被调用多次的问题就会得到解决
RACMulticastConnection *connection = [four multicast:[RACReplaySubject subject]];
[connection connect];
[connection.signal subscribeNext:^(id x) {
NSLog(@"fristSignal 1");
}];
[connection.signal subscribeNext:^(id x) {
NSLog(@"fristSignal 2");
}];
结果
2015-10-17 00:16:55.053 conatAndThen[4576:2977593] oneSignal createSignal
2015-10-17 00:16:55.054 conatAndThen[4576:2977593] oneSignal dispose
2015-10-17 00:16:55.055 conatAndThen[4576:2977593] fristSignal 1
2015-10-17 00:16:55.056 conatAndThen[4576:2977593] fristSignal 2
来看看RACMulticastConnection是怎么解决问题的
mulitcast 这个方法,首先就创建了一个RACMulticastConnection对象保存参数起来
connect 方法里面会对sourceSignal subscribe 也就是执行createBlock
所以我们看到是fristSignal 1比dispose先一步执行
这时我们在后续操作的subscriNext的signal已经不是原来的signal了,
而是didsubscribeBlock为空的signal,所以不管后面有多少次subscribNext都不会让createBlock重复执行
ReactiveCocoa 谈谈RACMulticastConnection的更多相关文章
- ReactiveCocoa 谈谈concat
今天的一个业务流程,业务流程大概就是这样的 1.从CoreData中获取之前的数据 2.更新界面 3.从网络获取数据 4.判断获取结果 5.处理错误判断 6.更新界面 7.判断结果numberOfNe ...
- RAC & MVVM 学习资料整理
最后更新:2017-01-23 参考链接: MVVM奇葩说 MVVM 介绍 Model-View-ViewModel for iOS [译] 唐巧--被误解的 MVC 和被神化的 MVVM React ...
- 最快让你上手ReactiveCocoa之基础篇
前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,这里介绍一下. 1.Rea ...
- ReactiveCocoa学习
ReactiveCocoa常见类 6.1RACSiganl:信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据. 注意: 信号类(RACSiganl),只是表示当数据 ...
- IOS ReactiveCocoa
一 前提: 在iOS开发过程中,当某些事件响应时,需处理的某些业务逻辑 Eg. 按钮点击:action ScrollView滚动:delegate 属性值改变:KVO ReactiveCocoa为事件 ...
- 【iOS】小项目框架设计(ReactiveCocoa+MVVM+AFNetworking+FMDB)
上一个项目使用到了ReactiveCocoa+MVVM+AFNetworking+FMDB框架设计,从最初的尝试,到后来不断思考和学习,现在对这样一个整体设计还是有了一定了理解与心得.在此与大家分享下 ...
- ReactiveCocoa学习总结
最近一直断断续续学习关于ReactiveCocoa的知识内容,对于它的一些基础内容将通过本文进行一个总结,主要是一些入门知识 一:RACSignal一些运用 @interface RACSignalT ...
- ReactiveCocoa基础知识内容
本文记录一些关于学习ReactiveCocoa基础知识内容,对于ReactiveCocoa相关的概念如果不了解可以网上搜索:RACSignal有很多方法可以来订阅不同的事件类型,ReactiveCoc ...
- ReactiveCocoa比较区分replay, replayLast和replayLazily
一直搞不清楚replayLazily和replay的区别可以直接跳到最后看. 原文:http://spin.atomicobject.com/2014/06/29/replay-replaylast- ...
随机推荐
- JS 变量提升
var a = 1; function foo() { console.log(a); var a = 2; } foo(); //undefined 根据变量提升机制,最后得出undefined; ...
- 密码加密md5和sha
package cn.springmvc.util;import java.security.MessageDigest;import java.security.NoSuchAlgorithmExc ...
- 怎样从官网下载Spring的jar包
第一种,简单粗暴直接http://repo.springsource.org/libs-release-local/org/springframework/spring/3.2.4.RELEASE/s ...
- SSAS数据挖掘算法简介
决策树分析算法:以二叉树的形式展现,分析出影响某种行为(如购买自行车)的因素,并对这些因素排序. 聚类分析算法:物以类聚,人以群分.分析特定群体所共同含有的属性(因素). 未完,待续..
- 问题记录:spark读取hdfs文件出错
错误信息: scala> val file = sc.textFile("hdfs://kit-b5:9000/input/README.txt") 13/10/29 16: ...
- HW4.10
public class Solution { public static void main(String[] args) { int count = 0; for(int i = 100; i & ...
- Call Hierarchy(方法调用层次)
在VS2010中的一项新功能:Call Hierarchy窗口,它可以审查代码,确定方法在哪里调用,以及它们与其他方法的关系. 打开一个类文件,找有方法体实现代码的方法,右键选择View Call H ...
- HTTP 和 SOAP 标头 来传递用户名密码 验证webservice用户认证
支持自定义的 HTTP 和 SOAP 标头 注意:本主题中的内容适用于 Microsoft Office SharePoint Server 2007 SP1. 对于 Web 服务,您可以使用 HTT ...
- 安装PHP出现make: *** [sapi/cli/php] Error 1 解决办法
ext/iconv/.libs/iconv.o: In function `php_iconv_stream_filter_ctor':/home/king/php-5.2.13/ext/iconv/ ...
- Scala的安装(本地)
前言 Scala版本的选法: 目前,Kafka库和JDBC并不支持Scala2.11的编译,以及结合大多数人的使用请来看. scala2.10.*为主,在这,scala2.10.4版本,强烈 ...