怎么热处理盐水冷却时间冷信号与热信号

故障诊断中的信号处理方法的研究--《武汉理工大学》2011年硕士论文
故障诊断中的信号处理方法的研究
【摘要】:伴随着科学技术以及现代化工业的发展,设备结构日趋复杂,系统的非线性更强,系统故障导致的外部特征更为复杂,基于线性分析的诊断技术一般难以解决大型、复杂设备的诊断问题。因此,非线性、非平稳性信号的分析与处理成为故障诊断中的一个关键问题。人们往往通过对信号特征的深入分析,得到信号源或者系统特性、运行情况以及故障信息,信号分析是获取信号源或信号传递系统特征信息的重要手段。因此可以说信号分析是故障诊断的基础。
本文就结合传统的信号处理方法以及最新的基于非平稳性的信号处理方法,来分析故障信号,从而解决实际问题。本文研究了故障诊断中的信号分析方法,主要的研究内容可以概括为以下几个方面:
首先是古典方法。重点讨论了Fourier分析和模式识别方法,给出了常规诊断中的一些定性、定量指标。
其次是Wigner分布。重点研究了Wigner分布的特点和基本思想方法,并结合此方法讨论了时频分布的相应结果。最后基于Wigner分布的非线性和交项干扰,结合仿真分析与实验分析,讨论了Wigner分布在转子系统碰摩故障中的应用,证明了Wigner分布对非平稳信号的有效性及其对噪声的不敏感性。
最后是小波分析。重点研究了小波理论的性质极其特征,给出了连续小波变换和二进离散小波变换,以及小波变换在工程上的理解。并基于小波包变换的优良时一频特性,以及更高的分辨率,给出了瞬态信号阈值去噪的方法。通过和一般的小波阈值去噪方法相比较表明,本文的方法提高了重构信号的信噪比,而且很容易得到信号的波至点。通过理论分析和实验结果,证明了该方法的可行性,并且简单有效。
【关键词】:
【学位授予单位】:武汉理工大学【学位级别】:硕士【学位授予年份】:2011【分类号】:TN911.7【目录】:
摘要4-5Abstract5-9第1章 绪论9-15 1.1 选题背景及意义9-10 1.2 故障诊断技术的发展与国内外现状10-13 1.3 本论文的研究内容13-15第2章 故障诊断的一般方法15-27 2.1 基于经典傅里叶分析的故障诊断15-21
2.1.1 Fourier分析及其故障诊断特征量15-18
2.1.2 倒频谱变换18-19
2.1.3 希尔伯特变换19-21 2.2 设备故障诊断的模式识别21-26
2.2.1 模式识别21-23
2.2.2 特征选择与特征提取23-26 2.3 本章小结26-27第3章 Wigner-Ville分布及应用27-39 3.1 WVD分布28-30 3.2 WVD的计算30-31 3.3 WVD在转子系统碰摩故障中的应用31-38 3.4 本章小结38-39第4章 故障分析中的小波研究39-53 4.1 连续小波变换40-43 4.2 离散小波变换与二进小波变换43-44 4.3 多分辨率分析与Mallt算法44-48
4.3.1 多分辨率分析44-47
4.3.2 Mallt算法47-48 4.4 小波变换的工程理解48-50 4.5 正交小波包变换50-52
4.5.1 小波包的数学模型50-51
4.5.2 小波包的计算算法51-52 4.6 本章小结52-53第5章 小波变换在信号降噪中的应用53-61 5.1 瞬态信号的阈值去噪54-57 5.2 计算机模拟结果与分析57-59 5.3 本章小结59-61第6章 总结与展望61-62参考文献62-65作者在攻读硕士学位期间发表的学术论文65-66致谢66
欢迎:、、)
支持CAJ、PDF文件格式
【参考文献】
中国期刊全文数据库
朱哲;钟伟红;;[J];安徽电子信息职业技术学院学报;2008年06期
赵红怡,武梦龙,曹淑琴;[J];北方工业大学学报;2004年01期
李赣湘,王增寿,严佳民;[J];导弹与航天运载技术;2000年01期
张常年,赵红怡;[J];红外与激光工程;2002年02期
吴今培,吴伟蔚;[J];吉首大学学报(自然科学版);2002年01期
高锦宏;徐小力;吴国新;张兴国;;[J];机械设计与制造;2008年09期
林京,屈梁生;[J];机械工程学报;2000年12期
孙志勇;王仲生;;[J];科学技术与工程;2008年16期
王亮军;;[J];科学之友(B版);2007年10期
郭玉刚;[J];辽宁师专学报(自然科学版);2004年02期
中国博士学位论文全文数据库
郭元术;[D];长安大学;2000年
中国硕士学位论文全文数据库
杨种山;[D];西安电子科技大学;2000年
洪涛;[D];长春理工大学;2003年
赵志宇;[D];大连理工大学;2005年
【共引文献】
中国期刊全文数据库
陈学锋;瞿金平;;[J];工程塑料应用;2008年03期
陈文元;李雪梅;迟晓梅;;[J];四川建筑科学研究;2006年03期
谢晓娣;[J];安徽电气工程职业技术学院学报;2005年01期
李晶;谷彩连;;[J];安徽电气工程职业技术学院学报;2008年01期
司圣柱;[J];安徽教育学院学报;2004年03期
朱哲;钟伟红;;[J];安徽电子信息职业技术学院学报;2008年06期
李素云;张德祥;;[J];安徽电子信息职业技术学院学报;2012年01期
高清维,程玉林,明军;[J];安徽大学学报(自然科学版);1999年04期
张德祥;吴小培;卢一相;;[J];安徽大学学报(自然科学版);2009年02期
王素华,张伟林;[J];安徽建筑工业学院学报(自然科学版);2004年03期
中国重要会议论文全文数据库
陈保家;李力;赵新泽;;[A];第二十六届中国控制会议论文集[C];2007年
章大勇;吴文启;吴美平;;[A];第二十七届中国控制会议论文集[C];2008年
杨辰龙;;[A];中国自动化学会控制理论专业委员会C卷[C];2011年
王重阳;彭圆;张风珍;牟林;;[A];中国声学学会水声学分会2011年全国水声学学术会议论文集[C];2011年
陈丽;吴仁彪;卢丹;;[A];第三届中国卫星导航学术年会电子文集——S07北斗/GNSS用户终端技术[C];2012年
曾朝阳;贾鑫;张晓永;;[A];中国光学学会2010年光学大会论文集[C];2010年
陈晓清;马君国;赵宏钟;付强;;[A];中国光学学会2010年光学大会论文集[C];2010年
孙红;李民赞*;郑立华;赵瑞娇;安晓飞;邓晓蕾;;[A];中国农业工程学会2011年学术年会论文集[C];2011年
汤辰;毕传兴;徐亮;;[A];现代振动与噪声技术(第九卷)[C];2011年
蒋瑜;陈循;陶俊勇;;[A];第九届全国振动理论及应用学术会议论文集[C];2007年
中国博士学位论文全文数据库
范迪;[D];山东科技大学;2010年
殷复莲;[D];哈尔滨工程大学;2010年
吴冬梅;[D];哈尔滨工程大学;2010年
邓志鑫;[D];哈尔滨工程大学;2009年
朱广平;[D];哈尔滨工程大学;2009年
刘文海;[D];哈尔滨工程大学;2010年
宫宇;[D];大连海事大学;2010年
苏晓宏;[D];大连海事大学;2010年
邹玮;[D];苏州大学;2010年
彭富强;[D];湖南大学;2010年
中国硕士学位论文全文数据库
李锦;[D];南昌航空大学;2010年
黄正荣;[D];南昌航空大学;2010年
张亮;[D];山东科技大学;2010年
杨焱麟;[D];山东科技大学;2010年
赵奇;[D];山东科技大学;2010年
陈磊;[D];长春理工大学;2010年
任泉;[D];浙江理工大学;2010年
蒋静;[D];郑州大学;2010年
吴国曾;[D];郑州大学;2010年
李卫鹏;[D];郑州大学;2010年
【二级参考文献】
中国期刊全文数据库
高千里,赵群,迟惠生;[J];北京大学学报(自然科学版);1999年01期
焦李成,保铮;[J];电子学报;1993年07期
丁宏,戴逸松,石要武;[J];电子学报;1997年01期
张可数,马洪,游志胜,梅田三千雄;[J];电子学报;2001年09期
黄春琳,柳征,姜文利,周一宇;[J];电子学报;2002年09期
范中,田立生;[J];电子学报;1996年01期
彭玉华,汪文秉;[J];电子学报;1996年04期
张磊,潘泉,张洪才,戴冠中;[J];电子学报;1999年02期
潘明海,刘永坦,赵淑清;[J];电子科学学刊;2000年04期
马莉波,张亮,侯紫峰,沈振康;[J];电子科学学刊;2000年04期
中国重要会议论文全文数据库
程庆国;;[A];中国土木工程学会第八届年会论文集[C];1998年
【相似文献】
中国期刊全文数据库
吴梅;李中健;刘小刚;;[J];弹箭与制导学报;2006年04期
张进;冯志鹏;褚福磊;;[J];振动与冲击;2011年01期
林吉良;蒋静坪;;[J];电工技术学报;2008年11期
秦岭;杨君;;[J];电子工程师;2006年01期
徐晓东;蒋新华;余明扬;;[J];兰州工业高等专科学校学报;2006年01期
赵扬;阎有运;;[J];科技信息;2009年17期
田刚;;[J];国外电子测量技术;2005年12期
孙成祥;晁勤;;[J];科技广场;2006年11期
刘伯鸿;;[J];现代电子技术;2006年24期
孙成祥;晁勤;;[J];江西科学;2007年01期
中国重要会议论文全文数据库
王晓丽;周浔;韩现刚;;[A];2009全国虚拟仪器大会论文集(二)[C];2009年
孙玉宗;李惠琪;陆强;王明清;;[A];第十一届全国自动化应用技术学术交流会论文集[C];2006年
张武军;徐金梧;杨德斌;屈蓉;周艳玲;王海峰;;[A];2001中国钢铁年会论文集(下卷)[C];2001年
胡博;陶文华;崔博;白一彤;尹旭;;[A];2009中国控制与决策会议论文集(2)[C];2009年
黄闯;侍洪波;;[A];2004中国控制与决策学术年会论文集[C];2004年
李伟;何涛;吴庆华;;[A];湖北省机械工程学会青年分会2006年年会暨第2届机械学院院长(系主任)会议论文集(上)[C];2006年
何斌;戚佳杰;;[A];第九届全国振动理论及应用学术会议论文集[C];2007年
王江萍;鲍泽富;;[A];2006年石油装备学术研讨会论文集[C];2006年
唐金山;王景中;张永光;马润津;;[A];1995年中国智能自动化学术会议暨智能自动化专业委员会成立大会论文集(下册)[C];1995年
曹志锡;孙莉;;[A];中国职业安全健康协会2007年学术年会论文集[C];2007年
中国重要报纸全文数据库
黄安华;[N];中国汽车报;2002年
李萍;[N];世界金属导报;2007年
胡荣山 马巍;[N];中国船舶报;2007年
孙建阳 刘波;[N];中国渔业报;2008年
仝亚娜;[N];机电商报;2005年
小田;[N];中国电脑教育报;2000年
陈全东;[N];中国包装报;2003年
龚献荣;[N];中国化工报;2005年
周传勇 杜慧;[N];世界金属导报;2008年
汤怀京;[N];中国计算机报;2004年
中国博士学位论文全文数据库
张君;[D];华北电力大学(河北);2005年
钱华明;[D];哈尔滨工程大学;2004年
宋其江;[D];哈尔滨工业大学;2010年
陈非;[D];华中科技大学;2010年
冯志鹏;[D];大连理工大学;2003年
何小斌;[D];上海交通大学;2009年
宋凯;[D];浙江大学;2005年
李敏;[D];太原理工大学;2010年
鲁峰;[D];南京航空航天大学;2009年
刘文艺;[D];重庆大学;2010年
中国硕士学位论文全文数据库
马晶;[D];武汉理工大学;2011年
张新明;[D];清华大学;2006年
赵志宇;[D];大连理工大学;2005年
周春健;[D];南京航空航天大学;2004年
赵康德;[D];江苏大学;2010年
刘满国;[D];西北工业大学;2005年
徐谋;[D];武汉理工大学;2006年
侯艳华;[D];吉林大学;2005年
侯乃明;[D];华北电力大学(河北);2010年
马雪;[D];吉林大学;2004年
&快捷付款方式
&订购知网充值卡
400-819-9993
《中国学术期刊(光盘版)》电子杂志社有限公司
同方知网数字出版技术股份有限公司
地址:北京清华大学 84-48信箱 大众知识服务
出版物经营许可证 新出发京批字第直0595号
订购热线:400-819-82499
服务热线:010--
在线咨询:
传真:010-
京公网安备75号非信号处理类硕士生“信号处理与数据分析”课程研究--《中国电子教育》2013年03期
非信号处理类硕士生“信号处理与数据分析”课程研究
【摘要】:正一、引言信号处理是对检测接收到的信号进行分析和处理以便抽取出有用的信息的过程,是对信号进行提取、变换、分析和综合等处理过程的统称。自20世纪60年代以来,随着信息科学和计算机科学与技术的发展,信号处理的理论和技术得到了迅速提高,成为一门具有重要作用的新兴学科,在包括航空航天、卫星雷达、信息通信和工业过程等诸多
【作者单位】:
【关键词】:
【基金】:
【分类号】:TN911.7-4;G642【正文快照】:
一、引言信号处理是对检测接收到的信号进行分析和处理以便抽取出有用的信息的过程,是对信号进行提取、变换、分析和综合等处理过程的统称。自20世纪60年代以来,随着信息科学和计算机科学与技术的发展,信号处理的理论和技术得到了迅速提高,成为一门具有重要作用的新兴学科,在
欢迎:、、)
支持CAJ、PDF文件格式,仅支持PDF格式
【相似文献】
中国期刊全文数据库
赵宝华;阮文惠;;[J];计算机工程;2008年17期
熊立新;金文芬;;[J];湖南农机;2010年05期
刘巍;郭伟;;[J];科教新报(教育科研);2009年05期
肖建国;;[J];中国成人教育;2010年08期
潘鹏宇;于晨旭;;[J];徐州师范大学学报(教育科学版);2011年02期
王佳明;张丽娜;;[J];中国科教创新导刊;2011年19期
庞志华;;[J];和田师范专科学校学报;2005年06期
马云辉;陈永海;黄岚;;[J];科教文汇(上旬刊);2010年01期
于胜杰;赵云云;李娟;;[J];北京信息科技大学学报(自然科学版);2010年S1期
那木拉;;[J];阴山学刊(自然科学版);2007年01期
中国重要会议论文全文数据库
郭峰;;[A];第十一届全国心理学学术会议论文摘要集[C];2007年
普园媛;梁虹;杨鉴;;[A];电子高等教育学会2005年学术年会论文集[C];2005年
靳娟;;[A];着力提高高等教育质量,努力增强高校创新与服务能力——北京市高等教育学会2007年学术年会论文集(下册)[C];2008年
沈庭芝;;[A];探索的脚步——“十一五”北京高等教育教材建设论文集[C];2010年
赵淑清;杨巧宁;李学斌;;[A];电子高等教育学会2005年学术年会论文集[C];2005年
杨鉴;张榆峰;王威廉;;[A];电子高等教育学会2005年学术年会论文集[C];2005年
杨冬晓;;[A];电子高等教育学会2005年学术年会论文集[C];2005年
杨巧宁;袁洪芳;李学斌;赵淑清;;[A];电子高等教育学会2005年学术年会论文集[C];2005年
王明泉;;[A];电子高等教育学会2005年学术年会论文集[C];2005年
王金良;;[A];第十一届全国心理学学术会议论文摘要集[C];2007年
中国重要报纸全文数据库
涂诗薇;[N];中国妇女报;2006年
柯昌万;[N];中国教育报;2006年
强建周 秦明 张哲浩;[N];科技日报;2006年
杨健;[N];人民日报;2006年
季谭;[N];第一财经日报;2007年
艾丹青?通讯员
叶璟;[N];杭州日报;2007年
舒晋瑜;[N];中华读书报;2009年
袁跃;[N];财会信报;2007年
刘锡潼;[N];北京商报;2007年
姜澎;[N];文汇报;2010年
中国博士学位论文全文数据库
魏署光;[D];华中科技大学;2013年
中国硕士学位论文全文数据库
刘琦;[D];西安电子科技大学;2009年
张楠;[D];华中科技大学;2004年
王文平;[D];北京邮电大学;2007年
康荔;[D];厦门大学;2006年
张慧;[D];东北师范大学;2007年
郁玮;[D];上海外国语大学;2009年
魏联;[D];厦门大学;2008年
陈红霞;[D];天津大学;2004年
孙艳;[D];大连理工大学;2006年
董莹莹;[D];上海外国语大学;2012年
&快捷付款方式
&订购知网充值卡
400-819-9993
《中国学术期刊(光盘版)》电子杂志社有限公司
同方知网数字出版技术股份有限公司
地址:北京清华大学 84-48信箱 大众知识服务
出版物经营许可证 新出发京批字第直0595号
订购热线:400-819-82499
服务热线:010--
在线咨询:
传真:010-
京公网安备75号冷信号和热信号
这里感谢cocoachina论坛Noah前辈对我的耐心讲解,同时本文参考了臧成威前辈的
冷热信号的理解
以前我对冷信号和热信号的认知就是没订阅的就是冷信号,订阅了的就是热信号,但是最近研究副作用时看了几篇文章打破了我以前的观点.例如RACSignal一般创建出来就是冷信号,RACSubject,RACComand内部返回的信号, RACMulticastConnect这些就是热信号,区别就好比冷信号是一段视频,发过来可以完整的接收到,而热信号就好比是直播,你在订阅的时候有可能信息错过了的话就会收不到.
实际上冷热信号的区分并不是这样的,热信号指,即使外部没有订阅,里面已经源源不断发送值了,你在订阅的时候如果前面的信号错过了就错过了不会再有,这就是为何RACSubject为何要先订阅才能收到信号的原因;冷信号因为每次订阅都会执行一次,每个订阅都是独立行为。这和我们是否去订阅他并没有什么直接的关系,在RAC2中 RACSignal是信号,RACSubject是热信号,RACSignal和子类排除RACSubject是冷信号,而在RAC4中signal是热信号 SignalProducer是冷信号.
我们一般使用热信号的时候会非常谨慎的使用,因为RACSubject会被滥用太方便了,我们一般会使用replay*的方法或者multicast、publish方法来转化或者创建热信号.
RACSubject即使有多少个订阅者,它都只会执行一次,并将结果返回。另外RACMulticastConnection这种内部实现实际上是多个订阅者订阅了一个subject,控制执行行为并不是通过被订阅,而是手动控制的
对RAC副作用的个人理解
副作用指的就是RAC改变了外界的状态(例如全局属性的赋值,多次网络请求,线程锁等),这些可能会导致一个问题,那就是同样的输入可能会导致不同的输出,同时也增加了我们排查代码错误的难度.以网络请求为例,现实中一般是不会这么用的,这里只是举个例子.请求若使用冷信号,我们对这个冷信号在进行一些操作的时候,臧成威前辈讲其实内部对一些信号的操作是再次订阅的过程,那么最后你可能会导致多次请求的问题出现,这便可以理解为副作用.严格地讲iOS开发其实就是一个在创造副作用的过程.现实中我们一般会把请求放到viewmodel中,只请求一个数据,然后将数据转成相应的属性暴露在.h文件,然后控制器在和数据进行绑定,这样做非常的优雅.
冷信号转热信号
这是臧成威前辈给出的冷信号转热信号比较常用的方法,他比subject直接订阅冷信号的优点在于例如subject的订阅者提前终止了订阅,而subject并不能终止对coldSignal的订阅,具体实现代码如下:
RACSignal *coldSignal = [RACSignal createSignal:^RACDisposable *(id&RACSubscriber& subscriber) {
NSLog(@&Cold signal be subscribed.&);
[[RACScheduler mainThreadScheduler] afterDelay:1.5 schedule:^{
[subscriber sendNext:@&A&];
[[RACScheduler mainThreadScheduler] afterDelay:3 schedule:^{
[subscriber sendNext:@&B&];
[[RACScheduler mainThreadScheduler] afterDelay:5 schedule:^{
[subscriber sendCompleted];
RACSubject *subject = [RACSubject subject];
NSLog(@&Subject created.&);
//RACMulticastConnection:用于当一个信号,被多次订阅时,为了保证创建信号时,避免多次调用创建信号中的block,造成副作用,可以使用这个类处理。
//也可以通过signal publish创建
RACMulticastConnection *multicastConnection = [coldSignal multicast:subject];
RACSignal *hotSignal = multicastConnection.
[[RACScheduler mainThreadScheduler] afterDelay:2 schedule:^{
[multicastConnection connect];
[hotSignal subscribeNext:^(id x) {
NSLog(@&Subscribe 1 recieve value:%@.&, x);
[[RACScheduler mainThreadScheduler] afterDelay:4 schedule:^{
[hotSignal subscribeNext:^(id x) {
NSLog(@&Subscribe 2 recieve value:%@.&, x);
另一种写法
RACSignal *coldSignal = [RACSignal createSignal:^RACDisposable *(id&RACSubscriber& subscriber) {
NSLog(@&Cold signal be subscribed.&);
[[RACScheduler mainThreadScheduler] afterDelay:1.5 schedule:^{
[subscriber sendNext:@&A&];
[[RACScheduler mainThreadScheduler] afterDelay:3 schedule:^{
[subscriber sendNext:@&B&];
[[RACScheduler mainThreadScheduler] afterDelay:5 schedule:^{
[subscriber sendCompleted];
RACSubject *subject = [RACSubject subject];
NSLog(@&Subject created.&);
RACMulticastConnection *multicastConnection = [coldSignal multicast:subject];
RACSignal *hotSignal = multicastConnection.
[[RACScheduler mainThreadScheduler] afterDelay:2 schedule:^{
[hotSignal subscribeNext:^(id x) {
NSLog(@&Subscribe 1 recieve value:%@.&, x);
[[RACScheduler mainThreadScheduler] afterDelay:4 schedule:^{
[hotSignal subscribeNext:^(id x) {
NSLog(@&Subscribe 2 recieve value:%@.&, x);ReactiveCocoa4中的冷信号和热信号 - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了5395字,被0人关注,获得了1个喜欢
ReactiveCocoa4中的冷信号和热信号
在阅读本文之前,强烈安利以下三篇文章:
在RAC4中,Singal对应RAC2中的RACSubject即为热信号,而SignalProducer对应RAC2中的RACSignal即为了冷信号。冷信号和热信号的区别,可参考以上三篇文章。
1. 热信号Signal
为了验证Signal具有热信号的特点,进行如下实验
let (signal, observer) = Signal&String, NSError&.pipe()
QueueScheduler.mainQueueScheduler.scheduleAfter(0.1) {
signal.observeNext {
NSLog("Subscriber 1 get a next value: \($0) from signal")
signal.observeNext {
NSLog("Subscriber 2 get a next value: \($0) from signal")
//开始发送第一个包
QueueScheduler.mainQueueScheduler.scheduleAfter(1) {
NSLog("signal send package 1"); observer.sendNext("send package 1")
QueueScheduler.mainQueueScheduler.scheduleAfter(1.1) {
signal.observeNext {
NSLog("Subscriber 3 get a next value: \($0) from signal")
//发送第二个包
QueueScheduler.mainQueueScheduler.scheduleAfter(2) {
NSLog("signal send package 2"); observer.sendNext("send package 2")
按照时间顺序来解释上述代码:
0s 创建signal这个热信号
立即订阅该信号,该订阅者命名为订阅者2
0.1s订阅刚刚创建的热信号Signal,该订阅者命名为订阅者1
1ssignal发送第一个包
1.1s后订阅该信号,该订阅者命名为订阅者3
2s后signal发送第二个包
看一下程序的运行情况
17:37:30.242 ColdSignalAndHotSignal[8] Start
17:37:30.245 ColdSignalAndHotSignal[8] Subscriber 2 subscribe
17:37:30.366 ColdSignalAndHotSignal[8] Subscriber 1 subscribe
17:37:31.295 ColdSignalAndHotSignal[8] signal send package 1
17:37:31.298 ColdSignalAndHotSignal[8] Subscriber 2 get a next value: send package 1 from signal
17:37:31.299 ColdSignalAndHotSignal[8] Subscriber 1 get a next value: send package 1 from signal
17:37:31.434 ColdSignalAndHotSignal[8] Subscriber 3 subscribe
17:37:32.246 ColdSignalAndHotSignal[8] signal send package 2
17:37:32.246 ColdSignalAndHotSignal[8] Subscriber 2 get a next value: send package 2 from signal
17:37:32.246 ColdSignalAndHotSignal[8] Subscriber 1 get a next value: send package 2 from signal
17:37:32.246 ColdSignalAndHotSignal[8] Subscriber 3 get a next value: send package 2 from signal
分析输出结果:
30.242s, signal创建,开始计时
30.245s,即0s后,订阅者2订阅signal
30.366s,即0.1s后,订阅者1订阅signal,可以看到订阅者1、2的订阅时间相差约0.1s
31.295s,即1s后,signal发送第一个包
31.298s,即1s后,订阅者2接收到signal发送的包,并打印出来。可以看到signal一发送,订阅者立刻就接受到
31.299s,即1s后,订阅者1接收到signal发送的包,并打印出来。几乎和订阅者2同时接收到包
31.434s,即1.1s后,订阅者3订阅signal,注意订阅者3并没有收到第一个包
32.246s,即2s后,signal发送第二个包
32.246s,即2s后,订阅者2立即接收到signal发送的包
32.246s,即2s后,订阅者1立即接收到signal发送的包
32.246s,即2s后,订阅者3立即接收到signal发送的包
根据上面的分析结果可知:
订阅者对热信号没有任何影响,无论是否有订阅者订阅热信号,热信号都会发送事件
订阅者几乎是同时接收到信号发出的事件(忽略微小的延迟)
如果订阅者在热信号发送事件之后在订阅,订阅者无法接收到订阅之前的事件
因此,根据热信号的特点,可以得到下图:
热信号.png
2. 冷信号SignalProducer
同样为了验证SignalProducer具有冷信号的特点,进行如下实验
NSLog("producer start")
let producer = SignalProducer&String, NSError& {
sink, _ in
//开始发送第一个包
QueueScheduler.mainQueueScheduler.scheduleAfter(1) {
NSLog("producer send package 1"); sink.sendNext("send package 1")
//发送第二个包
QueueScheduler.mainQueueScheduler.scheduleAfter(2) {
NSLog("producer send package 2"); sink.sendNext("send package 2")
QueueScheduler.mainQueueScheduler.scheduleAfter(2) {
NSLog("Subscriber 1")
producer.startWithNext {
NSLog("Subscriber 2 get a next value: \($0) from producer")
QueueScheduler.mainQueueScheduler.scheduleAfter(3) {
NSLog("Subscriber 2")
producer.startWithNext {
NSLog("Subscriber 2 get a next value: \($0) from producer")
按照时间顺序来解释上述代码:
0s创建冷信号producer
1sproducer发送第一个包
2sproducer发送第二个包
2s,订阅冷信号producer该订阅者命名为订阅者1
3s,订阅冷信号producer该订阅者命名为订阅者2
10:43:45.683 ColdSignalAndHotSignal[0] producer start
10:43:47.886 ColdSignalAndHotSignal[0] Subscriber 1
10:43:48.685 ColdSignalAndHotSignal[0] Subscriber 2
10:43:48.889 ColdSignalAndHotSignal[0] producer send package 1
10:43:48.892 ColdSignalAndHotSignal[0] Subscriber 1 get a next value: send package 1 from producer
10:43:49.685 ColdSignalAndHotSignal[0] producer send package 1
10:43:49.686 ColdSignalAndHotSignal[0] Subscriber 2 get a next value: send package 1 from producer
10:43:49.890 ColdSignalAndHotSignal[0] producer send package 2
10:43:49.890 ColdSignalAndHotSignal[0] Subscriber 1 get a next value: send package 2 from producer
10:43:50.686 ColdSignalAndHotSignal[0] producer send package 2
10:43:50.686 ColdSignalAndHotSignal[0] Subscriber 2 get a next value: send package 2 from producer
分析输出结果
45.683s,创建冷信号
47.886s,即2s后,订阅者1订阅冷信号producer
48.685s,即3s后,订阅者2订阅冷信号producer
48.889s,即3s后,producer发送第一个包,(为什么是在3s后发送?)
48.892s,即3s后,与此同时,订阅者1接收到producer发出的第一个包
49.685s,即4s后,producer再次发送第一个包(为什么又发送一次?)
49.686s,即4s后,与此同时,订阅者2接收到producer发送的第一个包
49.890s,即4s后,producer发送第二个包
49.890s,即4s后,与此同时,订阅者1接收到producer发出的第二个包
50.686s,即5s后,producer再次发送第二个包
50.686s,即5s后,与此同时,订阅者2接收到producer发出的第二个包
虽然输出结果混合在一起,但通过分析可以得知4、6提出的问题
为什么producer是在3s后发送第一个包?
因为,订阅者1是在2s后才订阅冷信号producer,然后producer在1s后发给订阅者1第一个包(注意:是发给订阅者1),这也解释了为什么producer每个包会发两遍
为什么又发送一次?
producer再次发送第一个包是发送给订阅者2的,而订阅者2是在3s后才订阅冷信号producer,然后producer在1s后发给订阅者2第一个包
上面分析也证明了SignalProducer具有冷信号的特点
SignalProducer`是一对一发送,这句话可能不好理解。这里可以理解成,有几个订阅者,冷信号就发送几次同样的信号
每个订阅者都能接收到同样的事件。例如上面订阅者2在3s后订阅,那它就在4s后和5s后接收到事件
因此,根据冷信号的特点,可以得到下图:
冷信号.png
有一句话很形象地说明了冷热信号的特点:
热信号类似“直播”,错过了就不再处理。而冷信号类似“点播”,每次订阅都会从头开始。
由上述分析,可以得知RAC2和RAC4中的冷热信号有如下关系:
SignalProducer
RACSubject
3. 冷信号的副作用(Side Effect)
在提出了,如果冷信号中包含网络请求,那么每次订阅这个冷信号都会发送网络请求,而且任何的信号转换即是对原有的信号进行订阅从而产生新的信号
对于上述遇到的副作用,有两种解决办法:
确保只对冷信号进行一次订阅
将冷信号转换成特殊的热信号
对于解决方法1,对于一些简单的业务逻辑适用,获得冷信号,订阅冷信号,处理发出的事件。然而对于一些逻辑复杂的场景,需要对返回的信号进行多次处理,就需要对冷信号进行转换,以避免副作用
4. 特殊的热信号
为什么是特殊的热信号?特殊在哪?和普通的热信号又要什么区别?在解释这些问题之前,先看一个简单的实验
let signal = signalFromNetwork()
signal.observeNext {NSLog("subscriber get a next value: \($0)")}
这里假设signalFromNetwork()是发送网络请求后获得的一个热信号signal(注意是热信号),然后订阅该信号,这里简单地打印事件。
但是,如果运行这段代码,并没有输出任何结果。是因为返回的信号没有发送任何next事件吗?
func signalFromNetwork() -& Signal&String, NSError& {
return Signal&String, NSError& {
observer in
NSLog("signal send hello")
observer.sendNext("Hello")
return nil
实际上,返回的热信号发送了一个next事件,但是订阅者没有收到。
我们把上面代码稍微改一下
func signalFromNetwork() -& Signal&String, NSError& {
return Signal&String, NSError& {
observer in
QueueScheduler.mainQueueScheduler.scheduleAfter(1) {
NSLog("signal send hello")
observer.sendNext("Hello")
return nil
即,信号1s后再发送事件,在看代码的运行结果
14:59:45.150 ColdSignalAndHotSignal[2] signal send hello
14:59:45.153 ColdSignalAndHotSignal[2] subscriber get a next value: Hello
这是我们可以看到有了输出结果。这就说明了之前订阅者为什么没有接收到事件,因为在订阅者订阅热信号之前,热信号就已经发送了事件。而这次是因为热信号延迟了1s才发送事件,所以订阅者才能接收到数据
虽然,我们可以让生成信号的时候,延迟一段时间在发送事件,但RAC提供一种更好的热信号来处理这种情况。
这就是RAC2中的RACReplaySubject,这种信号特点在于:
无论是否有订阅者订阅该信号,该信号都会发送事件,这点和热信号一致
无论订阅者何时订阅信号,订阅者都能立即接收到该信号所发送的事件,这点和冷信号相似,但有很大的不同
而在RAC4中,我们使用SignalProducer.buffer(Int)这个方法来代替RACReplaySubject
同样通过一个实验来证明SignalProducer.buffer和RACReplaySubject具有同样的特点
let (producer, sink) = SignalProducer&String, NSError&.buffer(Int.max)
NSLog("producer start!")
producer.startWithNext {
NSLog("Subscriber 1 get a next value: \($0) from producer")
//开始发送第一个包
QueueScheduler.mainQueueScheduler.scheduleAfter(1) {
NSLog("producer send package 1"); sink.sendNext("send package 1")
//发送第二个包
QueueScheduler.mainQueueScheduler.scheduleAfter(2) {
NSLog("producer send package 2"); sink.sendNext("send package 2")
QueueScheduler.mainQueueScheduler.scheduleAfter(4) {
producer.startWithNext {
NSLog("Subscriber 2 get a next value: \($0) from producer")
因为代码和之前实验代码相似,这里只简单解释下:1
创建特殊的热信号,并在1s,4s后发送两个包
在0s和1.5s时,订阅者1、2订阅了该信号
以下是输出结果:
15:31:23.821 ColdSignalAndHotSignal[8] producer start!
15:31:24.861 ColdSignalAndHotSignal[8] producer send package 1
15:31:24.863 ColdSignalAndHotSignal[8] Subscriber 1 get a next value: send package 1 from producer
15:31:26.037 ColdSignalAndHotSignal[8] producer send package 2
15:31:26.037 ColdSignalAndHotSignal[8] Subscriber 1 get a next value: send package 2 from producer
15:31:28.237 ColdSignalAndHotSignal[8] Subscriber 2 get a next value: send package 1 from producer
15:31:28.237 ColdSignalAndHotSignal[8] Subscriber 2 get a next value: send package 2 from producer
来分析输出结果的一些特点:
所有事件,信号只发送了一次
订阅者1是0s订阅的,毫无疑问,订阅者1可以接收到所有事件
订阅者2是4s才订阅的,而此时信号已经发出了所有的事件,如果是普通的热信号,订阅者2是接受不到任何事件的,但这里订阅者2却同时接收到了信号发送的所有事件,就像所有的事件缓存起来一样
根据特点,我们可以得到ReplaySubject和SingalProducer.buffer产生的信号的图
特殊的热信号.png
而且这种信号的命名也很有意思,在RAC2中是Replay,代表事件可以重放。而在RAC4中是buffer,代表事件被缓存起来
现在回到冷信号副作用的问题上,因为buffer返回的信号,具有热信号的特点,不会产生副作用。同时又能像冷信号一样,确保所有的订阅者都能接收到事件。
现在将本节signalFromNetwork()作出一些更改
func signalFromNetwork() -& SignalProducer&String, NSError& {
let (producer, sink) = SignalProducer&String, NSError&.buffer(Int.max)
NSLog("signal send hello")
sink.sendNext("Hello")
return producer
然后来订阅返回的信号
let signal = signalFromNetwork()
QueueScheduler.mainQueueScheduler.scheduleAfter(2) {
NSLog("Subscriber 1")
signal.startWithNext{NSLog("Subscriber get a next value: \($0)")}
QueueScheduler.mainQueueScheduler.scheduleAfter(4) {
NSLog("Subscriber 2")
signal.startWithNext{NSLog("subscriber 2 get a next value: \($0)")}
为了突出效果,我们故意使用两个订阅者订阅了该信号,并且一个延时到2s才订阅,一个延时到4s才订阅,来看下输出结果:
15:48:50.192 ColdSignalAndHotSignal[5] signal send hello
15:48:52.394 ColdSignalAndHotSignal[5] Subscriber 1
15:48:52.397 ColdSignalAndHotSignal[5] Subscriber get a next value: Hello
15:48:54.594 ColdSignalAndHotSignal[5] Subscriber 2
15:48:54.595 ColdSignalAndHotSignal[5] subscriber 2 get a next value: Hello
和预期的一样,无论有多少个订阅者,信号都只会发送一次事件,而且无论订阅者多迟才订阅该信号都能收到信号发送的事件。
然而,有些情况下,类似signalFromNetwork()这种方法是别人提供的,而且返回的就是一个冷信号SignalProducer 这种情况,你可能无法修改signalFromNetwork()内部代码。那要如何处理这个冷信号,避免副作用呢?
在RAC4.0,SignalProducer添加了replayLazily这个方法,避免了冷信号的副作用
我们将signalFromNetwork()改成返回冷信号
func signalFromNetwork() -& SignalProducer&String, NSError& {
let producer = SignalProducer&String, NSError& {
observer, _ in
NSLog("signal send hello")
observer.sendNext("Hello")
return producer
而订阅该信号的代码如下:
let signal = signalFromNetwork().replayLazily(1)
QueueScheduler.mainQueueScheduler.scheduleAfter(2) {
NSLog("Subscriber 1")
signal.startWithNext{NSLog("Subscriber get a next value: \($0)")}
QueueScheduler.mainQueueScheduler.scheduleAfter(4) {
NSLog("Subscriber 2")
signal.startWithNext{NSLog("subscriber 2 get a next value: \($0)")}
只是在返回信号调用replayLazily方法,其余都不变
16:11:54.223 ColdSignalAndHotSignal[4] start
16:11:56.423 ColdSignalAndHotSignal[4] Subscriber 1
16:11:56.429 ColdSignalAndHotSignal[4] signal send hello
16:11:56.429 ColdSignalAndHotSignal[4] Subscriber get a next value: Hello
16:11:58.623 ColdSignalAndHotSignal[4] Subscriber 2
16:11:58.623 ColdSignalAndHotSignal[4] subscriber 2 get a next value: Hello
貌似和之前和输出结果有点不一样,忽略那个start吧!只有Subscriber1和signal send hello顺序颠倒了,从时间上来看,信号发送事件的时间延迟了。
5. buffer和replayLazily中的参数capacity
在使用这两个方法时,需要传一个名为capacity参数,那这个参数是什么意思呢?感兴趣的同学可以先去看看官方文档是怎么解释的。
这里通过小实验来研究这个参数的意义
let (producer, sink) = SignalProducer&String, NSError&.buffer(1)
sink.sendNext("A")
sink.sendNext("B")
sink.sendNext("C")
QueueScheduler.mainQueueScheduler.scheduleAfter(2) {
producer.startWithNext{print($0)}
很简单的一段代码,信号发送三个next事件,2s后,订阅者订阅该信号。
如果你以为输出的是A B C,那就请看实际运行结果
貌似只输出一个C,那A和B呢
接下来,我们把buffer(1)改成buffer(3)
在看输出结果
到这就应该明白capacity的含义,就是指SignalProducer为订阅者缓存多少个事件,如果发送事件数超过缓存容量,则先发送的事件会被后发送的事件覆盖,这也解释了为什么当capacity=1时,只输出C
同样replayLazily中的capacity参数也是同样的含义
但是,如果将上面的例子改成replayLazily,输出结果会有略微的不同,自己分析原因吧
图片引用自:
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:

我要回帖

更多关于 公共事件热反应冷处理 的文章

 

随机推荐