HTML5技术

iOS开发之ReactiveCocoa下的MVVM(干货分享) - 青玉伏案(2)

字号+ 作者:H5之家 来源:H5之家 2015-11-11 09:25 我要评论( )

下方截图是上个这个方法中的运行结果,从运行结果不难看出,通过Signal相应的方法处理完后,处理的结果会与新返回的信号量所绑定。原信号量中的值保持不变。每次信号量调用相应的方法处理完数据后,都会返回一个新

    下方截图是上个这个方法中的运行结果,从运行结果不难看出,通过Signal相应的方法处理完后,处理的结果会与新返回的信号量所绑定。原信号量中的值保持不变。每次信号量调用相应的方法处理完数据后,都会返回一个新的信号量,而这个信号量是独立于原信号量的。

    

    由上面的介绍可知,上面方法中的一坨代码可以写成下方的一串。因为一个方法调用后会返回一个持有新结果的新的信号量,然后在这个信号量的基础上再次调用信号量其他的方法。Signal还有其他一些好用的方法,用法和map方法类似,在此就不一一赘述了,gitHub上有相应的实例文档。

1 - (void)uppercaseString { , , ] rac_sequence].signal 4 map:^id(NSString * value) { 5 return [value capitalizedString]; 6 }] subscribeNext:^(id x) { , x); 8 }]; 9 }

 

    3.信号量开关(Switch)

    上面把信号量比喻成水管,那么Switch就是水龙头呢。通过Switch我们可以控制那个信号量起作用,并且可以在信号量之间进行切换。也可以这么理解,把Switch看成另一段水管,Switch对接那个水管,就流那个水管的水,这样比喻应该更为贴切一些。下方是一个关于Switch的一个小实例。

      (1) 首先创建3个自定义信号量(3个水管),前两个水管是用来接通不同的水源的(google, baidu), 而最后一个信号量是用来对接不同水源水管的水管(signalOfSignal)。signalOfSignal接baidu水管上,他就流baidu水源的水,接google水管上就流google水源的水。

      (2) 把signalOfSignal信号量通过switchToLatest方法加工成开关信号量。

      (3) 紧接着是对通过开关数据进行处理。

      (4) 开关对接baidu信号量,然后baidu和google信号量同时往水管里灌入数据,那么起作用的是baidu信号量。

      (5) 开关对接google信号量,google和baidu信号量发送数据,则google信号量输出到signalOfSignal中

- (void)signalSwitch { RACSubject *google = [RACSubject subject]; 5 RACSubject *baidu = [RACSubject subject]; 6 RACSubject *signalOfSignal = [RACSubject subject]; RACSignal *switchSignal = [signalOfSignal switchToLatest]; [[switchSignal map:^id(NSString * value) { stringByAppendingFormat:, value]; 14 }] subscribeNext:^(NSString * x) { , x); 16 }]; [signalOfSignal sendNext:baidu]; ]; ]; [signalOfSignal sendNext:google]; ]; ]; 28 }

    上面代码输出结果如下:

 

    4.信号量的合并

    信号量的合并说白了就是把两个水管中的水合成一个水管中的水。但这个合并有个限制,当两个水管中都有水的时候才合并。如果一个水管中有水,另一个水管中没有水,那么有水的水管会等到无水的水管中来水了,在与这个水管中的水按规则进行合并。下面这个实例就是把两个信号量进行合并。

    (1) 首先创建两个自定义的信号量letters和numbers

    (2) 吧两个信号量通过combineLatest函数进行合并,combineLatest说明要合并信号量中最后发送的值

    (3) reduce块中是合并规则:把numbers中的值拼接到letters信号量中的值后边。

    (4) 经过上面的步骤就是创建所需的相关信号量,也就是相当于架好运输的管道。接着我们就可以通过sendNext方法来往信号量中发送值了,也就是往管道中进行灌水。

- (void)combiningLatest{ 3 RACSubject *letters = [RACSubject subject]; 4 RACSubject *numbers = [RACSubject subject]; 5 6 [[RACSignal 7 combineLatest:@[letters, numbers] 8 reduce:^(NSString *letter, NSString *number){ 9 return [letter stringByAppendingString:number]; 10 }] 11 subscribeNext:^(NSString * x) { , x); 13 }]; [letters sendNext:]; ]; ]; ]; ]; 21 }

   上面示例的运行输出结果如下:

    下面是自己画的原理图,思路应该还算是清晰。

 

    5.信号的合并(merge)

      信号合并就理解起来就比较简单了,merge信号量规则比较简单,就是把多个信号量,放入数组中通过merge函数来合并数组中的所有信号量为一个。类比一下,合并后,无论哪个水管中有水都会在merge产生的水管中流出来的。下方是merge信号量的代码:

      (1) 创建三个自定义信号量, 用于merge

      (2) 合并上面创建的3个信号量

      (3) 往信号里灌入数据

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • CSS gradient渐变之webkit核心浏览器下的使用以及实例 - 孟然

    CSS gradient渐变之webkit核心浏览器下的使用以及实例 - 孟然

    2017-02-04 15:00

  • 移动web开发之rem响应式设计 - 放羊的星星bky

    移动web开发之rem响应式设计 - 放羊的星星bky

    2016-10-25 10:03

  • 关于IOS中safari下的select下拉菜单,文字过长不换行的问题 - 梦影雾花,尽是虚空

    关于IOS中safari下的select下拉菜单,文字过长不换行的问题 - 梦影雾

    2016-09-27 17:00

  • 如何独立开发一个网络请求框架 - 指尖下的幽灵

    如何独立开发一个网络请求框架 - 指尖下的幽灵

    2016-08-15 11:00

网友点评
<