iOS Reactivecocoa(RAC)知其所以然(源码分析,一篇足以)

MOWAA算法:多目标优化在盘式制动器设计中的应用 多目标优化算法(MOEA)是解决工程设计中需要权衡多个冲突目标的关键技术,其核心在于寻找Pareto最优解集。传统方法如加权平均容易陷入局部最优,而进化算法则面临解集分布不均的挑战。MOWAA算法通过引入竞争学习机制和自适应高斯扰动,有效提升了收敛速度和分布均匀性。该算法特别适用于盘式制动器设计等需要平衡制动效能、热衰减和磨损率的工程场景。在ZDT测试函数上的验证表明,MOWAA在收敛性和多样性上均优于NSGA-II等经典算法。结合MATLAB实现,该算法为复杂工程优化问题提供了高效解决方案。 阅读详情

前言

如今RAC大行其道,对其讲解的博客也多不胜数,稍微有点经验的估计也已经对这个爽到不要不要的框架运用自如了,真正沉下来研究其实现原理的估计也不在少数,这里仅仅是记录一下自己的分析理解,更是在写这篇博客的过程中深化自己对RAC的认知,可能就是想到哪写到哪,各位朋友能从其中学到东西是最好了,要是感觉没什么干货也别对小弟拍砖啊!

一、关于常见类

1、RACSiganl 信号类的使用

如下图:

信号类使用图

完成一个信号的生命周期分为四步:

  • 1、创建信号
  • 2、订阅信号
  • 3、发送信号
  • 4、取消订阅(图中未标明)

下面每一步我们细细道来:

1、创建信号

由上面的 信号类使用图可知,创建信号类方法中传入了一个返回值是RACDisposable 类型,参数是遵守 RACSubscriber 协议的吧,名为 didSubscribe 的block,具体实现如下:

由上图可知,内部创建的是一个 RACDynamicSignal 类型的信号,并将 didSubscribe 传入,内部实现如下:

这里就是重点了,首先先创建了一个 RACDynamicSignal 类型的信号,然后将传入的名为 didSubscribe 的block保存在创建的信号的 didSubscribe 属性中,此时仅仅是保存并未触发。

一句话总结:创建信号本质就是创建了一个 RACDynamicSignal 类型的信号,并将传入的代码块保存起来,留待以后调用。

2、订阅信号

由上面的 信号类使用图可知,有三种订阅信号的方式,分别是订阅 Next 、Error 、 completed ,内部实现如下:

首先我们来看第一步,就是创建一个订阅者,并传入相应的block,创建实现如下:

很明显,创建订阅者的实质是,创建一个订阅者,并保存相应的block,比如 net、error、或者complete,此时仅仅是保存并未触发!

由上面两图可知,三种订阅方式的流程模式是一致的,仅仅是保存的block不同而已,我们分析一种即可,so 接下来就以 subscribeNext 为例来逐步分析。

接下来,我们看看执行订阅命令这块的实现,如下:

这里,首先我们要知道此处代码实现是在 RACDynamicSignal 里,图中的 didSubscribe 就是第一步创建信号中保存的 didSubscribe block。

由上图可知第一步创建信号中保存的 didSubscribe 代码块在这里执行,并传入了刚刚生成的订阅者(此处的订阅者中保存里 Next block代码块)。

额外的,这里生成了一个 RACCompoundDisposable 类型的disposable,用来管理整个订阅结束及资源的清理,并以传入的订阅者、及当前信号、刚创建的disposable 生成一个 RACPassthroughSubscriber 类型的订阅者,此订阅者仅仅是将传入的三个对象整体包装了一下而已,实质起作用的还是在刚才创建的订阅者,所以,其包含的 next 代码块,依然直接调用即可。

之后,将执行 didSubscribe 代码块返回的 innerDisposable 传入刚刚生成disposable、并将执行此代码块的信号的 schedulingDisposable 也保存到RACCompoundDisposable类型的disposable中,然后统一管理整个订阅结束及资源的清理。

其中的innerDisposable 就是 上面的 信号类使用图 中表示的第四步,其会在信号结束订阅的时候被调用,做一些清理资源的工作。

而 schedulingDisposable 的话,实际上就是执行代码块放到相应的调度器中,假如没有设置的话,即为 backgroundScheduler,并异步执行 didSubscribe 代码块,假如设置的话就会返回nil,并直接执行代码块,此处嵌套就有点深了,随后讲解取消订阅的时候再细说。

此处用到的RACCompoundDisposable 类型的disposable有点类似于可变数组 NSMutableArray 。而当 RACCompoundDisposable 对象被 disposed 时,它会调用其所包含的所有 disposable 对象的 -dispose 方法。所以可以做统一管理。

一句话总结:订阅信号本质就是创建了一个 RACPassthroughSubscriber 类型的订阅者,并将传入的代码块保存起来,留待以后调用,同时调用了第一步创建信号中保存的代码块,并传入创建的订阅者。

3、发送信号

由上面的 信号类使用图可知,发送同样对应着三种方式,处理如下:

这里有三点需要知道

第一,发送信号就是执行相应block,此处执行的就是第二步中保存的相应的block。

第二,对于 sendError 和 sendCompleted 都是先取消订阅,再执行相应的代码块,而 sendNext 并未使订阅结束,这样的话,对之后讨论的各种组合方法中必须写上 sendCompleted来结束订阅的做法就好理解了。

第三,我们也看到三种方法中,假如信号没有相应的block代码块保存,即没有经过第二步去订阅保存代码块,就算是发送了信号也不会执行,此时也就是冷热信号的区别,当然用 RACSubject 来解释更容易理解。

一句话总结:发送信号就是执行订阅信号时对应的block。

4、取消订阅

经过上面三步,我们也了解到了想要结束订阅只要将相应生成的disposable执行dispose即可,那到底为什么呢?现在来讲一讲:

第二步订阅信号中有讲到,执行订阅的代码块实际上是放到相应的调度器中去执行的,如下图:

如上图,是不是很有疑问,假如currentScheduler不为nil的话,那岂不是没有dispose啥事,代码块就直接执行了?我当时也纳闷,不过框架中叙述如下(此处感谢雷神指导,么么哒!):

此时:代码块就不会放到调度器里去执行,而是直接执行,此时disposable的dispose方法就没啥卵用了。

假如currentScheduler为nil的话,会默认一个调度器去管理代码块,具体实现如下:

如图所示,可知在代码块未被调度的之前,生成的disposable被dispose的话,代码块就不会被执行。

一句话总结:取消订阅就是把订阅信号获得的disposable 进行dispose即可在调度器调度该部分代码之前禁止调用。

2、RACSubject 的使用

RACSignal的原理搞清了,接下来就比较好理解了,毕竟信号类都是继承与RACSignal,作用不同也仅仅是部分实现的方式不同而已。

如下图:

1、创建信号

由上图可知,创建RACSubject对象的时候同时创建了相应的一个disposable和一个订阅者数组,没有做其他事情。

一句话总结:创建信号就是额外实例化了一个订阅者数组,没有做其他事情。

2、订阅信号

大致流程与RACSignal是一致的,不同点在下面:

RACSinal订阅的时候直接执行了订阅命令,执行的是创建时保存的代码块,但RACSubject的做法是将订阅者保存到初始化时生成的那个订阅者数组内,此时每个订阅者都包含其对应的代码块(比如:next、error、complete)。

由此可以知道,RACSubject是可以多次订阅的,多次订阅就是把相应包含代码块的订阅者放入订阅者数组内。

另外,此处对于取消订阅做了一些清理工作,将保存的订阅者都移除。

一句话总结:订阅信号就是将代码块保存到订阅者中,并将订阅者添加到信号的订阅者数组中。

3、发送信号

大致流程与RACSignal是一致的,不同点在下面:

由上图可知,RACSubject的发送信号就是遍历自己的订阅者数组,然后分别发送信号。

这也是对月RACsubjec为什么假如有多个订阅者,发送一个信号所有的订阅者都收到的原因。

一句话总结:发送信号就是遍历自己的订阅者数组,然后分别发送信号,并执行该订阅者保存的代码块。

3、其他信号类

还是那句话,信号类都是继承与RACSignal,作用不同也仅仅是部分实现的方式不同而已。

如不同的订阅信号实现:

不同的发送信号实现:

授人以鱼不如授人以渔,知道了这种分析流程方法,其他相应的分析类似,朋友们可以自己试试分析一下,这样你就会发现其实并不是那么难!

4、RACCommand 的使用

这个就比较复杂了,因为他是基于信号的一个对象,里面绑定了很多相关的信号,这里只是讲一讲他的执行原理,及常用的一些方法的分析。

先上图如下:

RACCommand流程图

1、创建命令

由上面 RACCommand流程图 可知创建的时候传入一个返回值为RACSignal类型,参数为id类型的名为input的一个block,具体实现如下:

由上图可知,command的创建实质是额外创建了一个名为 _activeExecutionSignals 的信号数组,并把传入的block保存为 signalBlock 属性。

初始化的时候实际上还有很多其他绑定的代码,就不一一细说了,用到的下面会讲一下。

一句话总结:创建命令就是创建了一个RACCommand类的对象,并将传入的block保存为 signalBlock 属性,然后初始化了一个信号数组,留待以后接收命令信号。

2、订阅命令发出的信号

由上面 RACCommand流程图 可知订阅的信号经过了两步方法,第一步中executionSignals为创建命令时绑定的信号如下:

由上图可知,executionSignals实际上就是最新的第一步创建命令中创建的activeExecutionSignals信号数组。

第二步中的switchToLatest实质上取信号数组的最新的信号。

然后就订阅信号,月RACSignal的订阅流程一样,不再赘述。

一句话总结:订阅命令实质上就是订阅命令保存的信号数组中的最新的信号(目前代码的订阅)

3、判断命令是否执行

与executionSignals类似,在创建命令时也创建了一个信号来监听当前命令是否正在执行。

如上图所示,executing信号实际上是在检测是否有活跃信号,replayLast能确保是最新的值。

一句话总结:判断是否执行命令就是检测是否有活跃信号

4、执行命令

执行命令的话就是传入你所需要传入的对象即可,如下图

由上图,我们可以知道,执行命令先执行了第一步保存的signalBlock并传入接收到的参数,然后把得到的signal加入到第一步创建的 _activeExecutionSignals 信号数组中,留待第二步订阅使用。

一句话总结:执行命令就是将传入的对象传入signalBlock生成signal,并将signal添加到_activeExecutionSignals 信号数组中。

二、关于常用操作方法

1、核心方法bind

在实际开发中我们并不需要直接调用bind方法,但我们所使用API都是以bind方法为基础的,想要了解操作方法的实现原理,bind我们不得不深究一下。

先上 bind 流程图如下:

bind操作流程图

由上图可知,bind 操作方法的流程如下:

  • 1、创建信号源
  • 2、绑定源信号,生成绑定信号
  • 3、订阅绑定信号
  • 4、发送源信号
  • 5、取消订阅(不再赘述)

由此可知,与正常信号绑定订阅流程不同之处在于,多了一个绑定过程,并且最终订阅的是绑定生成的绑定信号。接下来我们一个一个理一下思路:

1、创建信号源

一句话总结:创建了一个 RACDynamicSignal 类型的信号,并将传入的代码块保存起来,留待以后调用。

2、绑定源信号,生成绑定信号

由 bind操作流程图可知,bind 方法传入了一个 RACStream * (^RACStreamBindBlock)(id value, BOOL *stop) 的block代码块,其具体实现如下(只截取核心的代码):

由上图可知,bind操作实际上直接返回了一个绑定信号信号,并将 didSubscriber 代码块 传入,保存到返回的信号内。

额外的,绑定信号的 didSubscriber 代码块 中做了两件事

第一,将bind方法传入的block保存为bindinfBlock,留待以后用,并且初始化了一个信号数组。

第二,在代码块内部订阅了源信号,并做了一些处理,如下:

由上面可知,订阅源信号传入的block,被保存在相应订阅者中,留待源信号发送信号触发,内部实现不再赘述。

一句话总结:bind操作实际上是直接生成绑定信号并返回,并且在生成绑定信号传入的didSubscriber block代码块中,保存了bind传入的block,初始化了信号数组,并且订阅了源信号,针对源信号发送信号的流程做了一些处理。(此时未执行,订阅才执行)

3、订阅绑定信号

订阅绑定信号就是实现了第二步中的 didSubscriber 代码块,就是说,第二步仅仅是保存,在订阅它的时候才会实现。

一句话总结:订阅绑定信号就是保存了nextBlock,并且创建订阅者,实现信号的didSubscriber block代码块。

4、发送信号

因为bind比较复杂,所以在此可以将其串起来

1、发送信号触发绑定信号 didSubscriber 代码块中订阅源信号时传入的NextBlock 代码块,如下:

2、是执行第三步中订阅绑定信号保存的从bind传入的额block代码块,并传入由订阅时的传参生成的新的传参,生成returnSignal,具体实现如下:

3、returnSignal内部实现如下

由代码可知,returnSignal实际上是保存了传入的新值,此时就是真正意义上的将源输入做了改变,最后实际输出的就是新保存的值。

4、接下来就是将生成的returnSignal做 addSignal 操作如下:

由上图代码可知,内部实现是直接订阅了传入的returnSignal。

5、之前我们也说过,不同信号对应不同的订阅代码,所以我们来看看returnSignal的订阅时的代码,如下:

由上图代码可知,returnSignal在订阅的时候就同时做了发送信号的任务,即直接就会走订阅保存的代码块,如下:

此处触发的是绑定信号的订阅者发送信号,就是执行绑定信号的 nextBlock,即:

此时就有了运行结果:

ok,bind操作方法就到这了,我已经用尽了我的洪荒之力,么么哒!

一句话总结:bind操作方法实质上就是生成新的绑定信号,利用returnSignal作为中间信号来改变源数据生成新的数据并执行新绑定信号的nextBlock代码块!

2、映射方法 map

所有操作方法都是以bind方法为核心的,这里分析一下映射方法即可,不在赘述其他方法,原理都是一样的,就是看怎么组合,怎么去处理相关逻辑达到不同操作方法达成的效果!

首先,看一下map的操作流程图,如下:

很显然,与 bind 的区别就是生成绑定信号的过程不同,具体实现如下:

由上图可知,从外面传入了一个参数为value,返回值为id类型的block代码块,时机返回的是 flattenMap,操作方法生成的信号,具体实现如下:

看,就是这里,在 map 方法中,返回的是 flattenMap 方法生成的信号,而 flattenMap 内部返回的是 bind 方法返回的信号,又回到了第一部分讲解的 bind实现原理

上图中的 stream,就是returnSignal,即 flattenMap方法传入的 block(value),如下图:

具体生成ReturnSignal的方法,还得往回看 map 方法如下:

由上图可知,传入的value已经被 map保存的方法所映射(即改变),如下:

一句话总结:map 映射方法的实质就是 bind 方法的深度封装,实际的信号流的流程还是以 bind为核心,只是巧妙的做了一些逻辑处理而已。

3、其他操作方法

对于操作方法,核心就是 bind,各种作用的不同就是各种 signal与 bind 方法的结合,外加一些巧妙的逻辑处理,明白了信号的原理、绑定的原理,任何其他的组合或者运用都是万变不离其宗的,写更多也不如自己去研究一下!么么哒!

所以,操作方法就写到这里!

四、后记

额,这样就差不多了吧,弄明白了本篇所介绍的几个常用的最基本的原理,其实已经对RAC了解的七七八八了,当然RAC还有很多值得去学习的思想,比如RAC宏的使用,各种UI操作的处理,他们其中的设计与原理也都很巧妙,网上也有很多博客介绍了,这里就暂时不深入探讨了,毕竟写到这里篇幅就已经够长了,大家有兴趣可以自己去看看,以后有时间了我在整理一下!

本文由作者 王隆帅 编写,转载请保留版权网址,感谢您的理解与分享,让生活变的更美好!


转:https://www.cnblogs.com/wanglongshuai/p/5838545.html


iOS-RAC学习笔记(三)——RACSignal信号流改头换面的祖师Bind 在前面提到了RAC的订阅原理,虽然中间忽略了一些其它东西(比如说RACSchedule,RACDisposable),但任何一个RACSignal的订阅事件的value的流向都是如此。既然是一步步的流,那我们在使用过程中,必然会出现想要改变这个流,或者对这个流进行一些包装。简单的说,从一个RACSignal在经过中间某一步的操作,已经变成另外一个RACSignal; 1. RACSign 阅读详情

相关推荐

ReactiveCocoa demo

写了很久了。简单应用

【iOS】—— 初识RAC响应式编程

一.核心:1.核心:信号类2.信号类的作用:只要有数据改变就会把数据包装成信号传递出去3.只要有数据改变就会有信号发出4.数据发出,并不是信号类发出,信号类不能发送数据二.使用方法:1.创建信号2.订阅信号三.实现思路:1.当一个信号被订阅,创建订阅者,并把nextBlock保存到订阅者里面。2.创建的时候会返回 [RACDynamicSignal createSignal:didSubscribe];3.调用RACDynamicSignal的didSubscribe。

m0_62386635的博客 1935

系统动力学仿真软件Vensim下载

Vensim是由美国Ventana Systems, Inc.所开发,是采用图示化编程的方式构建系统动力学模型,上手简单。Vensim有很多系列产品,其中Vensim PLE (Personal Learning Edition)是面向个人学习者的,完全免费,可直接官网下载,截止于2022/04/10,最新的Vensim PLE版本是9.2.3。

PMIIᶜᶜ的博客 1万+

①、iOS-RAC的开发用法-底层分析以及总结

这里写目录标题编程思想 `KVO` 、`RAC` 编程思想 KVO 、RAC 编程思想 KVO // 定义一个属性 用来监听值发生变化 @property (nonatomic, copy) NSString *name; // 1.添加监听 [self addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:NULL]; // 2.移除监听 -(void)dealloc {

慢慢来就很快。 885

Qt Tab Widget 实战:如何打造一个可动态增删的标签页管理器(附完整代码)

本文深入探讨了使用Qt框架中的Tab Widget控件构建动态标签页管理器的实战方法。通过分析动态增删的核心挑战,提供了完整的C++代码示例,涵盖信号槽机制、页面生命周期管理、上下文菜单实现以及状态持久化等关键功能,帮助开发者打造高效、用户友好的桌面应用界面。

bb456的博客 1042

电竞护航系统成品搭建俱乐部点单小程序开发三角洲小程序搭建

电竞护航系统成品搭建俱乐部点单小程序开发三角洲小程序搭建

dapengglove的博客 1681

ReactiveCocoa 学习资料2

#RAC中文资源列表 QQ讨论群:430033580 欢迎进群一起讨论。 ##入门 ReactiveCocoa 和 MVVM 入门 ReactiveCocoa入门教程:第一部分 ReactiveCocoa入门教程:第二部分 说说ReactiveCocoa 2 iOS 7最佳实践:一个天气App案例 Reactive Cocoa Tutorial [0

CSND_GO 859

开源AI数字人DUIX:从零构建你的智能交互助手

本文详细介绍了如何利用开源AI数字人DUIX从零构建智能交互助手。文章阐述了DUIX作为开源项目的核心优势,包括低成本启动、低网络依赖和高度可定制性,并提供了从开发环境搭建、核心模块(AI模型、语音、形象)配置到个性化业务逻辑开发与最终部署的完整实践指南,帮助开发者快速掌握构建专属AI数字人的全流程。

weixin_29051811的博客 502

ReactiveCocoa学习教程笔记

ReactiveCocoa 基础教程 iOS Reactivecocoa(RAC)知其所以然(源码分析,一篇足以) ReactiveCocoa核心元素与信号流 (来自美团的文章) ReactiveCocoa v2.5 源码解析之架构总览 ReactiveCocoa 最全常用API整理 ReactiveCocoa 实践 React

木木不 506

易智联LM401模块学习(四)——双串口收发

串口的发送和接受有三种方式,分别是阻塞发送和接收(轮询)、中断方式发送和接收、DMA方式发送和接收。这里我使用阻塞+中断的方式实现双串口通信。简单的串口收发。

weixin_46046597的博客 990

R语言数据可视化:绘制世界地图的两种方案

本文介绍了两种使用R语言绘制世界地图的方案:包含边界边框和不包含边界边框。无论您选择哪种方案,使用ggplot2包和相关的地理数据包,我们可以轻松地绘制出漂亮的世界地图。R语言提供了丰富的包和函数,使我们能够轻松地绘制世界地图,并根据需求添加边界边框。在本文中,我将介绍两种绘制世界地图的方案:一种包含边界边框,一种不包含边界边框。在上述代码中,我们使用了与方案一相同的数据准备和地图绘制步骤,但省略了添加边界边框的代码。函数的调用,我们可以绘制不包含边界边框的世界地图。方案二:绘制不包含边界边框的世界地图。

CodeMaven的博客 2225

ReactiveCocoa源码解析

(一)神奇的Macros  先说说RAC中必须要知道的宏 RAC(TARGET, [KEYPATH, [NIL_VALUE]])    使用: RAC(self.outputLabel, text) = self.inputTextField.rac_textSignal; RAC(self.outputLabel, text, @"收到nil时就显示我") = self.i

Secret Island 1144

PrimeTime low power-SMVA分析(4)

这些功能只有在将timing_enable_cross_voltage_domain_analysis变量设置为true时才能使用。DVFS场景与在分布式多场景分析(DMSA)中分析的运行条件场景无关。- check_timing 和 report_exceptions 命令通过将检查或报告应用于所有可能的场景和电压组合来支持SMVA。- 相位锁定环生成的时钟(create_generated_clock -pll_feedback 和 -pll_output)在多个场景的情况下,返回最差情况的值。

QRBQ 649

(完)④、iOS-RAC-在实际开发的使用-以登录注册为例子

iOS-RAC-在实际开发的使用iOS-RAC-在实际开发的使用-以登录注册为例子1、效果图2、类Viewcontroller.hViewcontroller.mLoginViewModel.hLoginViewModel.mUserModel.hUserModel.m3、分析代码的作用1.RAC的双向绑定 `正向传值`、`反向传值` 以输入账号改变头像的情况为例1.1.正向传值 就是通过UI 将值 传递给 ViewModel1.2.反向传值 就是通过ViewModel 将值 传递给 UI `如果开发不是使

慢慢来就很快。 759

华为OD机试真题 新系统-等距二进制判断(C/C++/Py/Java/Js/Go)

华为OD机试 新系统真题【等距二进制判断】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【等距二进制判断】

qq_45776114的博客 1085

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ReactiveCocoa核心元素与信号流

ReactiveCocoa(以下简称“RAC”)是一个函数响应式编程框架,它能让我们脱离Cocoa API的束缚,给我们提供另外一套编码的思路与可能性,它能在宏观层面上提升代码易读性与稳定性,让程序员写出富有“诗意”的代码,因此倍受业内推崇。本文略过RAC基本概念与基础使用(有些技术点可以参考美团点评技术博客之前的几篇文章:RACSignal,冷信号与热信号系列,内存泄漏。),着重介绍RAC数据流方面的内容,剖析RAC核心元素与RAC Operation在数据流中扮演的角色,并从数据流的角度切入,介绍R..

一个有情怀的程序猿博客 224

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

RAC源码分析(一)--RAC基本流程分析

文章目录RAC流程分析1. 信号产生2. 订阅信号3.发送信号4. 销毁 RAC流程分析 1. 信号产生 实际开发中,一个信号的产生 可以是UI RACobserver Sequence … 下面来看看createSignal都做了什么事情 //1. + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe { //把block封装进来 利用多态原理返回 RA

淡暗 785

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

②、iOS-RAC-核心类分析-RACPassthroughSubscriber订阅者-RACScheduler调度者-RACDisposable销毁者-RACObseve监听者-RACSubject

RAC流程源码①、RAC流程源码1.RAC流程分析 已经在 上一篇的[《iOS-RAC的开发用法-底层分析以及总结》讲过具体可以自行查看](https://blog.youkuaiyun.com/qq_42816425/article/details/122987794?spm=1001.2014.3001.5501)2.RAC核心类3.RAC的订阅者、RAC销毁者、RAC调度者4.1.RACPassthroughSubscriber(核心订阅者)3.2.RACScheduler(调度者)3.3.RACDisposab

慢慢来就很快。 726

ReactiveCocoa中文资源列表

转自:https://github.com/ReactiveCocoaChina/ReactiveCocoaChineseResources 入门 ReactiveCocoa 和 MVVM 入门 ReactiveCocoa入门教程:第一部分 ReactiveCocoa入门教程:第二部分 说说ReactiveCocoa 2 iOS 7最佳实践:一个天气Ap

Welcome to tikeyc's column 1140

ReactiveCocoa源码精讲(五) -- 终结篇

ReactiveCocoa终结篇 前面四篇文章我们分析了RAC的常用的基本用法和源码实现。今天,是关于RAC源码分析的最后一篇文章。今天介绍的两个类是RACMulticastConnection和RACCommand,这两个使用在现实开发中有着至关重要的作用,尤其是网络请求案例。 RACMulticastConnection 使用方法: //1.创建信号 RACSignal *signal...

weixin_39647415的博客 239

ReactiveCocoa 源码分析 - 收藏集 - 掘金

ReactiveCocoa 中 奇妙无比的 “宏” 魔法 - 掘金 前言 在ReactiveCocoa 中,开源库作者为我们提供了很多种魔法,“黑”魔法,“红”魔法……今天就让先来看看“红”魔法。 在ReactiveCocoa 中,封装了很多非常实用的“宏”,使用这些“宏”为我们开发带来了很多的便利。 今天就来盘点一下RAC... Rea...

weixin_33729196的博客 182

iOS面试 第三方库

返回上级目录:iOS面试专题一 1.AFNetworking AFNetworking - Github 2.SDWebImage SDWebImage - Github 3.ReactiveCocoa ReactiveCocoa - Github 4.AsyncDisplayKit AsyncDisplayKit - Github 面试总结

baidu_40537062的博客 687

ReactiveCocoa 中奇妙无比的“宏”魔法

2017-02-12 | 一缕殇流化隐半边冰霜 | iOS 前言 在ReactiveCocoa 中,开源库作者为我们提供了很多种魔法,“黑”魔法,“红”魔法……今天就让先来看看“红”魔法。 在ReactiveCocoa 中,封装了很多非常实用的“宏”,使用这些“宏”为我们开发带来了很多的便利。 今天就来盘点一下RAC中的宏是如何实现的。 目录 1.关于宏 2.ReactiveCocoa 中的元...

weixin_33871366的博客 149
上一篇: ReactiveCocoa进阶
下一篇: MVVM 参考
直隶码农
博客等级 码龄19年 95粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值