最近看了大神的博客后,感觉该对ReactiveCocoa做一个了断了。

首先大致的对以下关于ReactiveCocoa内容做一个简单的总结,其他的后续更新

  1.ReactiveCocoa的操作思想

  2.ReactiveCocoa的底层实现

  3.ReactiveCocoa的信号映射的使用和底层实现

  4.ReactiveCocoa的组合信号的使用和底层实现

  5.ReactiveCocoa的过滤信号的使用和底层实现

  6.ReactiveCocoa的秩序信号的使用和底层实现

  7.ReactiveCocoa的线程使用和底层实现

  8.ReactiveCocoa的时间信号的使用和底层实现

  9.ReactiveCocoa的重复信号的使用和底层实现

废话不多说,开干就完了,本文的学习思路主要来源于袁峥大神的博客

1.ReactiveCocoa的操作思想

  ReactiveCocoa运用的是Hook(钩子)细想,就是一种改变API执行结果的技术,在每次执行API之前,先执行你自己的方法,也就意味着可以对源程序就行修改,从而达到改变结果的输出的目的

2.ReactiveCocoa的底层实现

  bind(绑定)是ReactiveCocoa的核心方法,也是ReactiveCocoa的开发方式,之前的开发方式是赋值,而使用ReactiveCocoa开发后,应该把工作重点放到bind(绑定)上,也就是在创建对象的时候,就可以绑定他以后要做的事情,而不是等赋值后再去考虑。

  例如:之前我们开发的时候,如果把数据展示到控件上,一般使用setModel的方法,而ReactiveCocoa却在创建控件的时候就绑定好数据,只要数据有变化,就会马上通知控件发生变化

  2.1 bind方法的简单使用和介绍

    假设我们要监听文本框的内容变化,并且在文本框的内容前面加上'输出'两个字样

    方式一:在返回结果后面拼接'输出'

  [self.textField.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
NSLog(@"输出:%@",x);
}];

    方式二:在返回结果前使用ReactiveCocoa的bind方法,对源信号内容进行处理

    bind方法参数:需要传入一个RACSignalBindBlock的block参数,RACSignalBindBlock是一个block类型,返回值是参数为(value,*stop)的信号类型的block

    RACSignalBindBlock:

    参数一(value):表示接收源信号的值,就是未做处理的值

    参数二(*stop): 用于控制绑定信号的block,如果*stop = YES,那么就会结束绑定

    返回值:对源信号进行处理后的信号,一般使用RACReturnSignal,需要手动导入<ReactiveCocoa/RACReturnSignal.h>

  2.2 bind方法使用步骤:

    2.2.1 传入一个RACSignalBindBlock的block

    2.2.2 返回一个RACSignal类型的bindBlock作为block的返回值

    2.2.3 返回一个处理后的结果信号,作为bindBlock的返回值

    注意:在bindBlock中对源信号进行处理

  2.3 底层实现

    2.3.1 源信号调用bind,会创建一个绑定信号

    2.3.2 当绑定信号被订阅,就会调用绑定信号的didSubscribe,生成一个bindBlock

    2.3.3 当源信号有内容发出时,就是执行bindBlock(value,*stop)

    2.3.4 调用bindBlock(value,*stop),返回一个处理完成的信号(RACReturnSignal)

    2.3.5 订阅返回信号(RACReturnSignal),就会拿到绑定信号的订阅者,把处理完成的信号返回出去

    注意:不同的订阅者,生成不同的nextBlock

[[self.textField.rac_textSignal bind:^RACSignalBindBlock _Nonnull{
//什么时候调用
//block作用表示绑定了一个信号
return ^RACSignal *(id _Nullable value,BOOL *stop){
//当信号有新值发送过来时,就回调用block
//block作用:对返回值进行处理
//处理好的结果,通过信号(RACReturnSignal)返回出去
return [RACReturnSignal return:[NSString stringWithFormat:@"输出:%@",value]];
};
}] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];

3.ReactiveCocoa的信号映射的使用和底层实现

    3.1 flattenMap详解

    3.1.1 flattenMap的作用

      将源信号转变为新信号

    3.1.2 flattenMap的使用步骤

      3.1.2.1 传入一个block作为参数,block是一个参数为(value)返回值为RACSignal的block

      3.1.2.2 参数value是源信号的值,需要对源信号的值进行处理

      3.1.2.3 将处理后的结果,包装成信号(RACReturnSignal)发送出去

    3.1.3 flattenMap的底层实现

      3.1.3.1 flattenMap底层调用的依然是bind方法,flattemMap的block作为bind方法中的bindBlock的返回值

      3.1.3.2 当订阅绑定信号时,会调用didSubsribe,生成bindBlock

      3.1.3.3 当源信号发送新的内容的时候,会执行bindBlock(value,*stop)

      3.1.3.4 当调用bindBlock时,就是调用flattenMap的block,因此对源信号进行处理也是在这个block中进行的,最后把处理结果包装成信号

      3.1.3.5 返回的信号最终当作bindBlock返回的信号

      3.1.3.6 订阅bindBlock返回的信号,就会获得处理完成的内容

- (void)flattenMap
{
[[self.textField.rac_textSignal flattenMap:^__kindof RACSignal * _Nullable(NSString * _Nullable value) {
//block什么时候调用,源信号发出的时候,就会调用这个block
//block的作用:改变源信号的内容
//返回值:绑定信号的内容
return [RACReturnSignal return:[NSString stringWithFormat:@"输出:%@",value]];
}] subscribeNext:^(id _Nullable x) {
//订阅绑定信号,每当源信号发出新内容,做完处理后就会调用这个block
NSLog(@"%@",x);
}];
}

  3.2 map详解

    3.2.1 map信号的作用:把源信号的值映射成新值

    3.2.2 map的使用步骤

      3.2.2.1 传入一个返回值为对象的block,参数是value

      3.2.2.2 block的参数value就是源信号的值,应该在block中对value进行处理即可

      3.2.2.3 把处理好的值直接返回就好,不用返回信号,返回的值就是处理完成的值

    3.2.3 map的底层实现

      3.2.3.1 map底层调用的其实还是flattenMap操作,map中的block回作为flattenMap的block值

      3.2.3.2 其余同上述的flattenMap底层操作一样,不再赘述

- (void)map
{
[[self.textField.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
//当源信号有新的内容发出,就回调用这个block
//返回值:处理完源信号内容的值
return [NSString stringWithFormat:@"输出:%@",value];
}] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
}

4.ReactiveCocoa的组合信号的使用和底层实现

  4.1 concat信号

    4.1.1 concat信号作用:按一定顺序拼接信号,当信号发出的时候,按照一定顺序接收信号

    4.1.2 concat底层实现:(以事例中的signalA拼接signalB为例)

      4.1.2.1 当拼接信号被订阅,就会调用拼接信号didSubscribe

      4.1.2.2 didSubscribe中会先订阅第一个信号源(signalA)

      4.1.2.3 执行第一个信号源(signalA)的didSubscribe

      4.1.2.4 在第一个信号源(signalA)的didSubscribe中发送值,就会调用第一个信号源(signalA)订阅者的nextBlock,通过拼接信号的订阅者把值发送出去

      4.1.2.5 第一个信号源(signalA)的didSuscribe发送完成(sendCompleted),就会执行第一个信号源(signalA)订阅者的completeBlock,第二个信号源(signalB)就会被订阅

      4.1.2.6 第二个信号源(signalB)的执行过程如上,不再赘述

      注意:必须在第一个信号发送完成(sendCompleted)后,第二个信号才会执行

- (void)concat
{
RACSignal *signalA = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"A"];
[subscriber sendNext:@"A2"];
//注意:必须signalA发送完成信号后才会激活signalB,否侧不会执行signalB
[subscriber sendCompleted];
return nil;
}]; RACSignal *signalB = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"B"];
[subscriber sendNext:@"B2"];
[subscriber sendCompleted];
return nil;
}]; //把signalA拼接到signalB后,signal发送完成后,才会激活signalB
RACSignal *concatSignal = [signalA concat:signalB];
//注意:第一个信号完成后,第二个信号才会被激活
[concatSignal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}]; }

  4.2 then信号

    4.2.1 then信号作用:用于连接两个信号,当第一个信号完成(sendCompleted)时,才会连接then返回的信号

    4.2.2 then信号底层实现:

      4.2.2.1 过滤掉之前信号发送的值

      4.2.2.2 使用concat连接then返回的信号

      注意:then之前的信号必须发送完成(sendCompleted)后,才会发出then返回的信号

- (void)then
{
[[[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@];
//注意:then之前的信号必须发送完成(sendCompleted)之后,才会出发then返回的信号
[subscriber sendCompleted];
return nil;
}] then:^RACSignal * _Nonnull{
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@];
[subscriber sendCompleted];
return nil;
}];
}] subscribeNext:^(id _Nullable x) {
//只能接收第二个信号发送的值,也就是then信号发送的值
NSLog(@"%@",x);
}] ;
}

  4.3 merage信号

    4.3.1 merage信号作用: 把多个信号合并成一个信号,只要有一个信号发生变化,就会调用合并信号

    4.3.2 merage信号底层实现:

      4.3.2.1 合并信号被订阅,就会遍历所有的信号

      4.3.2.2 合并信号一旦被订阅,合并前的所有信号也会被订阅

      4.3.2.3 只要有一个信号发出内容,合并信号就会监听到

- (void)merage
{
RACSignal *signalA = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { [subscriber sendNext:@"A"];
[subscriber sendCompleted];
return nil;
}]; RACSignal *signalB = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"B"];
[subscriber sendCompleted];
return nil;
}]; RACSignal *merageSignal = [signalA merge:signalB]; [merageSignal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
}

  4.4 zip信号

    4.4.1 zip信号作用: 把两个信号压缩成一个信号,只有两个信号同时发出内容时,才会把两个信号发出的内容压缩成一个元组,从而调用压缩后的信号的nextBlock

    4.4.2 zip信号的底层实现:

      4.4.2.1 订阅压缩信号,就相当于订阅了压缩前的所有信号

      4.4.2.2 每当有信号发出内容,就会判断是否所有信号都发送出内容,如果都发送出了内容,那就会将其内容压缩成元组,通过压缩信号发送出去

- (void)zipWith
{
RACSignal *signalA = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"A"];
[subscriber sendCompleted];
return nil;
}]; RACSignal *signalB = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"B"];
[subscriber sendCompleted];
return nil;
}]; RACSignal *zipSignal = [signalA zipWith:signalB]; [zipSignal subscribeNext:^(id _Nullable x) {
RACTupleUnpack(NSString *a, NSString *b) = x;
NSLog(@"%@---%@",a,b);
}];
}

  4.5 combinelatest信号

    4.5.1 combinelatest信号作用:合并多个信号,并且拿到每个信号的最新值,必须每个信号至少sendNext一次后,才会发出合并信号,和zip信号一样,没有任何区别

    4.5.2 combineLatest底层实现:

      4.5.2.1 同zip底层实现类似

- (void)combineLatest
{
RACSignal *signalA = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"A"];
[subscriber sendNext:@"A2"];
[subscriber sendCompleted];
return nil;
}]; RACSignal *signalB = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"B"];
[subscriber sendNext:@"B2"];
[subscriber sendCompleted];
return nil;
}]; RACSignal *signalC = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"C"];
[subscriber sendNext:@"C2"];
[subscriber sendCompleted];
return nil;
}]; //把多个信号合并成一个信号,和zip一样,没有什么区别
[[RACSignal combineLatest:@[signalA,signalB,signalC]] subscribeNext:^(RACTuple * _Nullable x) {
RACTupleUnpack(NSString *a,NSString *b,NSString *c) = x;
NSLog(@"%@----%@-----%@",a,b,c);
}];
}

  4.6 reduce操作

    4.6.1 reduce操作的作用:用于信号发出的内容是元组,把组合信号发出的元组内容聚合成一个值,并发送出去

    4.6.2 reduce操作底层实现:

      4.6.2.1 订阅聚合信号,每次有内容发出,就只执行reduceBlock,把源信号的内容转换成reduceBlock返回的值

- (void)reduce
{
RACSignal *signalA = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"A"];
[subscriber sendNext:@"A2"];
[subscriber sendCompleted];
return nil;
}]; RACSignal *signalB = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"B"];
[subscriber sendNext:@"B2"];
[subscriber sendCompleted];
return nil;
}]; [[RACSignal combineLatest:@[signalA,signalB] reduce:^id(NSString *a, NSString *b){
return [NSString stringWithFormat:@"%@-%@",a,b];
}] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
}

5.ReactiveCocoa中过滤信号的使用和底层实现

  5.1 filter信号操作

    5.1.1 filter信号操作的作用:

      过滤信号,获取满足条件的信号

- (void)filter
{
[[self.textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
return value.length > ;
}] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@",x);
}];
}

  5.2 ignore信号操作

    5.2.1 ignore信号的作用:

      忽略某些值的信号

    5.2.2 底层实现

      内部调用filter操作,忽略某些值

- (void)ignore
{
[[self.textField.rac_textSignal ignore:@""] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@",x);
}]; [[@[@"",@"fdsf",@"",@"dfd"].rac_sequence.signal ignore:@"dfd"] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
}

  5.3 distinctUntilChanged信号操作

    5.3.1 distinctUntilChanged信号作用:

      当上次信号值和当前信号值有明显变化时才发出信号,否则被忽略掉

    5.3.2 使用场景:

      在开发中,刷新UI时经常使用这个信号,只有两次数据不一致才会刷新页面

    注意:distinctUntilChanged是比较上次信号值和当前信号值当比较

- (void)distinctUntilChanged
{
[[self.textField.rac_textSignal distinctUntilChanged] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@",x);
}]; [[@[@"",@"dsfsdf",@"dsfsdf",@"dsfsdf",@""].rac_sequence.signal distinctUntilChanged] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}]; }

  5.4 take信号操作

    5.4.1 take信号的作用:

      一次取几个信号

- (void)take
{
RACSubject *subject = [RACSubject subject];
[[subject take:] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}]; [subject sendNext:@];
[subject sendNext:@];
}

  5.5 takelast信号操作

    5.5.1 takelast信号作用:

      取最后第N次信号,前提条件,订阅者必须发送完成信号,因为只有完成才知道总共有几个信号

    注意:订阅者必须调用完成信号,因为只有完成才知道总共有几个信号

- (void)takelast
{
RACSubject *subject = [RACSubject subject]; [[subject takeLast:] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}]; [subject sendNext:@];
[subject sendNext:@]; //注意:订阅者必须调用完成信号,因为只有完成才知道总共有几个信号
[subject sendCompleted];
}

  5.6 takeUntil信号操作

    5.6.1 takeUntil信号作用:

      获取信号直到某个信号完成

- (void)takeUntil
{
[[self.textField.rac_textSignal takeUntil:self.rac_willDeallocSignal] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@",x);
}];
}

  5.7 skip信号操作

    5.7.1 skip信号作用:

      跳过几个信号

 //注意:textField的rac_textSignal默认执行一次,开始编辑执行一次
[[self.textField.rac_textSignal skip:] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@",x);
}];

  5.8 switchToLatest信号操作

    5.8.1 switchToLatest信号作用:

      用于signalOfSignals(信号中的信号),有的时候也会信号中发送信号

- (void)switchToLatest
{
RACSubject *signalOfSignals = [RACSubject subject];
RACSubject *signal = [RACSubject subject]; [signalOfSignals.switchToLatest subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}]; [signalOfSignals sendNext:signal];
[signal sendNext:@];
[signal sendNext:@];
}

6.ReactiveCocoa的秩序信号的使用和底层实现

  6.1 doNext和doCompleted信号的操作

    6.1.1 doNext和doCompleted信号的作用:

       doNext:执行subscribeNext之前,会先执行这个block
       doCompleted:执行complete之前,会先执行这个block

- (void)doNextAndDoCompleted
{
[[[[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"-----信号被订阅了-----");
[subscriber sendNext:@""];
[subscriber sendCompleted];
return nil;
}] doNext:^(id _Nullable x) {
NSLog(@"-----执行doNext-----%@",x);
}] doCompleted:^{
NSLog(@"-----执行doCompleted-----");
}] subscribeNext:^(id _Nullable x) {
NSLog(@"-----执行subscribeNext-----");
} completed:^{
NSLog(@"-----执行completed-----");
}] ;
}

7.ReactiveCocoa的线程信号的使用和底层实现

  7.1 deliverOn信号的操作

    7.1.1 deliverOn信号的作用:

      内容传递切换到制定线程中,副作用在原来线程中,把在创建信号时block中的代码称之为副作用

  7.2 subscribeOn信号的操作

    7.2.1 subscribeOn信号的作用:

      内容传递和副作用都会切换到制定线程中。

8.ReactiveCocoa的时间信号的使用和底层实现

  8.1 retry信号操作

    8.1.1 retry信号的作用:

      只要失败,就会重新执行创建信号中的block,直到成功

- (void)retry
{
__block int num = ;
[[[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
if(num == ){
[subscriber sendNext:@(num)];
}else{
NSLog(@"-----异常处理-----");
[subscriber sendError:nil];
}
num++;
return nil;
}] retry] subscribeNext:^(id _Nullable x) {
NSLog(@"-----执行了subscribeNext-----%@",x);
} error:^(NSError * _Nullable error) {
NSLog(@"-----执行了error-----");
}];

  8.2 replay信号操作

    8.2.1 replay信号的作用

      当一个信号被多次订阅时,反复播放内容。由此可以,信号是懒惰的,不订阅是不会执行的,下面例子如果不加replay,则第二个订阅者输出则是2,加上replay后,第一个订阅者和第二个订阅者输出都是1

- (void)replay
{
__block int num = ;
RACSignal *signal = [[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@(num++)];
[subscriber sendCompleted];
return nil;
}] replay]; [signal subscribeNext:^(id _Nullable x) {
NSLog(@"-----第一个订阅者-----%@",x);
}]; [signal subscribeNext:^(id _Nullable x) {
NSLog(@"-----第二个订阅者-----%@",x);
}];
}

  8.3 throttle信号操作

    8.3.1 throttle信号的作用:

      当一个信号发送比较频繁时,可以使用节流,在某一时间段内不发送信号

- (void)throttle
{
RACSubject *signal = [RACSubject subject];
//节流 在一定时间内,不接收任何信号,过了这个时间获取最后发送的信号内容
[[signal throttle:] subscribeNext:^(id _Nullable x) {
NSLog(@"-----执行了subscribeNext-----%@",x);
}]; [signal sendNext:@];
[signal sendNext:@];
[signal sendNext:@];
}

至此,ReactiveCocoa的基本操作就总结到这里,后期会继续更新ReactiveCocoa的更多的操作

ReactiveCocoa详解的更多相关文章

  1. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  2. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  3. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  6. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  7. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  8. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  9. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

随机推荐

  1. 详细讲解Android中的AbsListView的源码

    不知道各位童鞋们在开发的过程中有没有感兴趣过ListView是如何实现的呢?其实本身ListView的父类AbsListView才是关键,但是如果大家看过源码的话,会发现AbsListView将近70 ...

  2. React Native商城项目实战10 - 个人中心中间内容设置

    1.新建一个MineMiddleView.js,专门用于构建中间的内容 /** * 个人中心中间内容设置 */ import React, { Component } from 'react'; im ...

  3. 获取oracle数据库对象定义

    在oracle中,使用DBMS_METADATA包中的GET_DDL函数来获得对应对象的定义语句.GET_DDL函数的定义如下: DBMS_METADATA.GET_DDL ( object_type ...

  4. pom.xml文件设置

    一个相对完整的maven配置文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...

  5. 2019了,给自己立一个flag吧

    新年伊始,元旦已过,虽然有迟了,但是,相对于整年来说,还是比较早.年度总结,年度规划,除过上交的报告以外,还得自己给自己立个flag,一次来督促自己,而不是为了别的.做这些事,不仅仅是为了能更好的工作 ...

  6. 【minicap】基于图像识别的手机端UI自动化测试的截图方式更新

    minicap属于STF框架的一个工具,可以高速截图.同步手机屏幕至浏览器等   为什么用minicap截图: 经过试验,截同一个屏幕的一张图,adb shell screencap速度为2.9秒,而 ...

  7. day15生成器send方法,递归,匿名函数,max结合匿名工作原理,常用的内置函数

    复习 ''' 1.带参装饰器 - 自定义 | wraps def wrap(info) def outer1(func): from functools import wraps @wraps(fun ...

  8. python 列表、字典多排序问题

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/justin051/article/det ...

  9. 第一章:Java语言概述与环境开发

    1.计算机高级语言按程序的执行方式可以分为编译型和解释型两种: 2.JAVA程序的执行过程必须经过先编译后解释两个步骤: 3.JAVA语言里负责执行字节码文件的是JAVA虚拟机 (Java Virtu ...

  10. 剑指offer--day05

    1.1 题目:二进制中1的个数:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 1.2 解题思路:通过位移来进行.举例:7(二进制:0111),7 >> 1(得到:001 ...