xml地图|网站地图|网站标签 [设为首页] [加入收藏]

5929皇家赌场:iOS开发 —— ReactiveCocoa详解

来源:http://www.ccidsi.com 作者:集成介绍 人气:72 发布时间:2020-03-29
摘要:近年平昔在斟酌 ReactiveCocoa ,今后也来说讲 ReactiveCocoa 中有的根底类的效率。 ReactiveCocoa介绍 ReactiveCocoa(简称为 RAC ),是由Github开源的一个选取于iOS和OS开拓的框架.是三个用到函数响应

近年平昔在斟酌ReactiveCocoa,今后也来说讲ReactiveCocoa中有的根底类的效率。

ReactiveCocoa介绍

ReactiveCocoa(简称为RAC),是由Github开源的一个选取于iOS和OS开拓的框架.是三个用到函数响应式编制程序(FRPState of Qatar观念的框架.
ReactiveCocoa为事件提供了众多管理方法,利用 RAC 能够很方便将要处理的事件和监听的事件代码放在一齐,那样能够方便管理代码.使用 RAC 能够无需考虑调用顺序,而是直接构思结果.

前言

在大家iOS开辟进度中,当有些事件响应的时候,须要处理某个事情逻辑,那些事件都用区别的艺术来管理。比如开关的点击使用actionScrollView滚动使用delegate,属性值改换使用KVO等系统提供的主意。其实这一个事件,都能够因此RAC处理。

导入ReactiveCocoa

此间我们使用 cocoapod实行导入.在 podfile 中加多

pod 'ReactiveCocoa'

多数blog都在说ReactiveCocoa好用,然后各样秀本人怎么灵活运用ReactiveCocoa,但是认为真的贫乏的是一篇怎么着学习ReactiveCocoa的文章,小编看了过多篇都没看到怎么利用ReactiveCocoa,于是决定本身写一次关于读书ReactiveCocoa的随笔,本文首要针对如何从零开首学习ReactiveCocoa,这里极其感激3个人(支点的雷纯锋,camera360的宋潘,以致自身的小学弟何宗柱(笔者BOSE)),在自笔者商量ReactiveCocoa对本身的声援。

RACSiganl: 时限信号类,只是代表当数码变动时,实信号内部会发出数据,它自身不有所发送时域信号的技术,而是交由内部一个订阅者去爆发。

ReactiveCocoa基础类

在 RAC 中最普遍的类是RACSignal.在RAC 中最根本的概念就是信号.

假定钟爱自个儿的篇章,可以关怀自己,也得以来小码哥,精通下大家的iOS培训科目。之后还会更新《最快让您上手ReactiveCocoa之升级篇》

RACSubscriber: 表示订阅者的情趣,用于发送非确定性信号,那是一个说道,不是二个类,只要遵从这一个协议,并且实现情势技巧成为订阅者。通过create开创的时限信号,都有四个订阅者,支持她发送数据

1.RACSignal

RACSiganl:只要有数量变动,就能够把多少包装成叁个实信号传递出去.暗许三个时限信号都以冷频域信号,也正是值更换了,也不会触发,独有订阅了那些复信号,那些功率信号才会产生热实信号,值改造了才会接触。
RACSubscriber: 订阅者,用于发送确定性信号,那是叁个商讨,不是二个类,只要坚决守护那些左券,并且完毕格局才具成为订阅者。通过create创设的时域信号,都有一个订阅者,帮忙他发送数据。
RACDisposable:用于撤销订阅或许清理财富,当复信号发送实现可能发送错误的时候,就能够活动触发它。
怎么是冷热功率信号?
冷热复信号的定义源于.NET框架Reactive Extensions(大切诺基X卡塔尔(قطر‎中的Hot Observable和Cold Observable,两者的分化是:

  1. Hot Observable是积极的,纵然你并不曾订阅事件,不过它会天天推送,就像是鼠标移动;而Cold Observable是无所作为的,独有当您订阅的时候,它才会发布新闻。
  2. Hot Observable能够有八个订阅者,是一对多,会集能够与订阅者共享消息;而Cold Observable只可以一对一,当有两样的订阅者,音信是重复完整发送。
    那中间的Observables能够掌握为RACSignal。

1.ReactiveCocoa简介

RACDisposable: 用于撤除订阅可能清理财富,当时域信号发送完结可能发送错误的时候,就能够活动触发它。

RACSignal 的选拔手续:
  1. 创办时域信号: (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe;
  2. 订阅非确定性信号: - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock;
  3. 出殡时限信号: - (void卡塔尔(قطر‎sendNext:(idState of Qatarvalue;
    // 创建信号
    RACSignal *singal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // 发送信号
        [subscriber sendNext:@"发送信号"];
        return [RACDisposable disposableWithBlock:^{
            // 信号被取消订阅
            // 清空资源
            NSLog(@"取消订阅");
        }];
    }];
    // 订阅信号
    [singal subscribeNext:^(id x) {
        NSLog(@"%@", x);
        // 打印内容: "发送信号"
    }];

ReactiveCocoa(简单称谓为RAC),是由Github开源的二个使用于iOS和OS开拓的新框架,Cocoa是苹果整套框架的简单称谓,因而不菲苹果框架合意以Cocoa结尾。

 //1.创建信号 RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { //block调用时刻:每当有订阅者订阅信号,就会调用block //2.发送信号 [subscriber sendNext:@1]; //如果不再发送数据,最好发送信号完成,内部会自动调用[RACDisposable disposable]取消订阅 [subscriber sendCompleted]; return [RACDisposable disposableWithBlock:^{ //block调用时刻:当信号发送完成或者发送错误,就会自动执行这个block,取消订阅 NSLog; }]; }]; //3.订阅信号 [signal subscribeNext:^ { //block调用时刻:每当有信号发送数据,就会调用该方法 NSLog(@"接收到的数据:%@",x); }]; 

2.RACSubject

RACSubject:信号提供者,自身能够充作连续信号,又能发送实信号。

2.ReactiveCocoa作用

RACSubject:时限信号提供者,本身可以担任确定性信号,又能发送时域信号。subject可以想成是signal的变体,就像NSMutableArray相对于NSArray同等。它们是非RAC的代码和RAC代码之间的桥梁。

RACSubject使用手续
  1. 始建非数字信号: (instancetypeState of Qatarsubject; 跟RACSiganl不相似,创立功率信号时未尝block
  2. 订阅频域信号: - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
  3. 发送时域信号: - sendNext:(id卡塔尔(قطر‎value
    // 创建信号
    RACSubject *subject = [RACSubject subject];
    // 订阅信号
    [subject subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    // 发送信号
    [subject sendNext:@"subject发送信号"];

在大家iOS开辟进度中,当某个事件响应的时候,供给管理有些事情逻辑,这几个事件都用不一样的点子来拍卖。

RACReplaySubject:重新提供时域信号类,RACSubject的子类。

3. RACReplaySubject

RACReplaySubject:RACSubject的二个子类,用于保存发送过的值,当被订阅时,会向订阅者重新发送这一个值。使用手续和RACSubject相似.不一样的是,RACReplaySubject可以首发送频域信号,再订阅非实信号.RACSubject不可以.

举个例子开关的点击使用action,ScrollView滚动使用delegate,属性值改造使用KVO等系统提供的措施。

RACReplaySubjectRACSubject区别:

ReactiveCocoa 集合类

实质上那么些事件,都足以经过RAC处理

  • RACReplaySubject能够头阵送复信号,再订阅时限信号,RACSubject就不能。

  • RACReplaySubject能够安装capacity多少来限定缓存的value的多少,即只缓充最新的多少个值。

  • 如若三个连续信号每被订阅一遍,就要求把在此以前的值重复发送一次,就必要运用RACReplaySubject

1.RACTuple

RACTuple:元组.用于对数据的包装,( ps:对于使用过 swift 的人的话应该不不熟悉.卡塔尔国使用方法和数组近似

    RACTuple *tuple = [RACTuple tupleWithObjectsFromArray:@[@"123", @"321"]];
    NSString *str = tuple[0];
    // str 的值是"123"

ReactiveCocoa为事件提供了成都百货上千拍卖办法,并且使用RAC处监护人件很方便,能够把要拍卖的作业,和监听的业务的代码放在一块儿,那样特别便利大家管理,就不需求跳到相应的不二等秘书籍里。极度相符大家开荒中高集结,低耦合的思谋。

2.RACSequence

RACSequence:集结类,用于代替NSArray,NSDictionary,尚可它来急忙遍历数组和辞书。

  1. 数组转变为集结类
    NSArray *arr = @[@"123", @"341", @"213"];
    // 将数组转化为集合
    RACSequence *squence = arr.rac_sequence;
    // 将集合转化为信号(遍历集合里的所有元素)
    [squence.signal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
  1. 辞书转化为集结类
NSDictionary *dict = @{@"name":@"明月钓无痕", @"age":@"26"};
  [dict.rac_sequence.signal subscribeNext:^(id x) {
      // 遍历所有的元素
      NSLog(@"%@", x);  // x 是元组类型,每一个键值对,包装成一个元组.
     // 用来解析元组的宏 RACTupleUnpack
      // 宏里面的参数 传需要解析的变量名
      // = 右边 放需要解析的元组
      RACTupleUnpack(NSString *key, NSString *value) = x;
      NSLog(@"%@--%@", key, value);
  }];

3.编制程序观念

 //1.创建信号 RACSubject *subject = [RACSubject subject]; //2.订阅信号 [subject subscribeNext:^ { //block调用时刻:当信号发出新值,就会调用 NSLog(@"第一个订阅者%@",x); }]; [subject subscribeNext:^ { //block调用时刻:当信号发出新值,就会调用 NSLog(@"第二个订阅者%@",x); }]; //3.发送信号 [subject sendNext:@"1"]; //1.创建信号 RACReplaySubject *replaySubject = [RACReplaySubject subject]; // RACReplaySubject *replaySubject = [RACReplaySubject replaySubjectWithCapacity:0]; //2.发送信号 [replaySubject sendNext:@1]; [replaySubject sendNext:@2]; //3.订阅信号 [replaySubject subscribeNext:^ { NSLog(@"第一个订阅者%@",x); }]; [replaySubject subscribeNext:^ { NSLog(@"第二个订阅者%@",x); }];

ReactiveCocoa 事件管理类

RACCommand:RAC中用来处监护人件的类,能够把事件如哪管理,事件中的数据如何传递,包装到那么些类中,他得以很方便的监察事件的推行进程。
行使手续
1.开立命令 initWithSignalBlock:(RACSignal * (^)(id input))signalBlock
2.在signalBlock中,创立RACSignal,况且作为signalBlock的再次来到值
3.实行命令 - (RACSignal *)execute:(id)input

// 1. 创建命令
    RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
        // input: 执行命令时传入参数
        // 执行命令时调用 block
        NSLog(@"%@", input);
        // 2. 创建信号
        // 不能返回 nil. 如果要返回空信号使用 empty
        //   return [RACSignal empty];
        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            NSLog(@"====");
            [subscriber sendNext:@"请求数据"]; 
           // 数据传递完,最好调用sendCompleted,这时命令才执行完毕。
           [subscriber sendCompleted];
            return nil;
        }];
    }];    
    // 3. 执行命令
    RACSignal *signal = [command execute:@1];
    [signal subscribeNext:^(id x) {
        NSLog(@"x");
    }];

动用情况:

  1. 在RAC开辟中,日常会把互连网诉求封装到RACCommand,直接施行某些RACCommand就会发送须要。
  2. 当RACCommand内部央求到数量的时候,要求把诉求的多少传递给外部,这个时候就须要通过signalBlock再次来到的随机信号传递了。

在开辟中大家也无法太依仗于有些框架,不然这么些框架不更新了,导致项最近期不可能爱护,比方后面推特提供的Three20框架,在立时也是神器,不过后来不更新了,也就没怎么人用了。由此小编认为学习四个框架,依然有要求明白它的编程思想。

气象:跳转到另叁个ViewController,TwoViewController发送通告,ViewController收到回调的打招呼

ReactiveCocoa 西藏中国广播公司大的宏

RAC(TAHavalGET, ...卡塔尔国: 给有些对象的某部属性绑定三个实信号,只要信号内容改造,就能够把内容赋值给属性
RACObserve(TAQX56GET, KEYPATH卡塔尔:监听有个别对象的某些属性,重临的是频限信号.
@weakify(Obj卡塔尔(قطر‎和@strongify(Obj卡塔尔: 用于解决循环援用的主题素材
RACTuplePack(...State of Qatar: 用于把数量包装成元组
RACTupleUnpack(...卡塔尔国:用于分析元组

先简要介绍下这段时间我们已知的编制程序理念。

//ViewController里- click:(UIButton *)sender { TwoViewController *twoVC = [[TwoViewController alloc] init]; //设置代理信号 twoVC.delegateSubject = [RACSubject subject]; //订阅代理信号 [twoVC.delegateSubject subscribeNext:^ { NSLog(@"点击了通知按钮,%@",x); }]; //跳转 [self presentViewController:twoVC animated:YES completion:nil];}//TwoViewConrroller里 if (self.delegateSubject) { //发送信号 [self.delegateSubject sendNext:@"已跳转到TwoVC"]; } 

ReactiveCocoa 何足为奇用法

  1. 取代代理:- (RACSignal *)rac_signalForSelector:(SEL)selector;
  2. 代替布告
  [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UITextFieldTextDidChangeNotification object:nil] subscribeNext:^(NSNotification *x) {

  }];
  // 监听文本
  [[self.userName rac_textSignal] subscribeNext:^(id x) {
      NSLog(@"%@", x);
  }];  
  1. 代替 KVO
DZRedView *view = [[DZRedView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
  [self.view addSubview:view];
// 需要手动包含头文件  #import <NSObject RACKVOWrapper.h>
//    [view rac_observeKeyPath:@"frame" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
//        NSLog(@"%@, %@", value, change);
//    }];
//    view.x = 200;

  [[view rac_valuesAndChangesForKeyPath:@"frame" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld observer:nil] subscribeNext:^(id x) {
      NSLog(@"====%@", x);
  }];
  view.x = 100;
  1. 监听事件点击
  UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
  btn.backgroundColor = [UIColor redColor];
  [self.view addSubview:btn];
  [[btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
      NSLog(@"%@", x);
  }];

3.1面向进度:管理业务以进度为主干,一步一步的贯彻。

RACTuple:元组类,类似NSArray,用来包装值.

3.2面向对象:万物皆对象

RACSequence: RAC中的集合类,用于取代NSArray,NSDictionary,能够动用它来超快遍历数组和词典。

3.3链式编制程序观念:是将多少个操作(多行代码)通过点号(.卡塔尔(قطر‎链接在一同成为一句代码,使代码可读性好。a(1卡塔尔(قطر‎.b(2卡塔尔国.c(3卡塔尔国

 //第一步: 把数组转换成集合RACSequence numbers.rac_sequence // 第二步: 把集合RACSequence转换RACSignal信号类 numbers.rac_sequence.signal // 第三步: 订阅信号,激活信号,会自动把集合中的所有值,遍历出来。 // 1.遍历数组 NSArray *numbers = @[@1,@2,@3,@4]; [numbers.rac_sequence.signal subscribeNext:^ { NSLog; }];

 // 2.遍历字典,遍历出来的键值对会包装成RACTuple NSDictionary *dict = @{@"name":@"xiaoming",@"age":@18}; // 解包元组,会把元组的值,按顺序给参数里面的变量赋值 // 相当于以下写法 // NSString *key = x[0]; // NSString *value = x[1]; [dict.rac_sequence.signal subscribeNext:^ { RACTupleUnpack(NSString *name,NSString *age) = x; NSLog(@"%@ %@",name,age); }]; 

链式编制程序特点:方法的再次来到值是block,block必需有重回值(本人对象),block参数(需求操作的值)

  • 辞书转模型

代表:masonry框架。

宪章masonry,写多少个加法计算器,演练链式编制程序思想。

 //1.OC写法 NSDictionary *dict1 = @{@"name":@"xiaoming",@"age":@18}; NSDictionary *dict2 = @{@"name":@"xiaohua",@"age":@20}; NSArray *arrs = @[dict1,dict2]; NSMutableArray *items = [NSMutableArray array]; for (NSDictionary *dict in arrs) { FlagItem *item = [FlagItem flagWithDict:dict]; [items addObject:item]; } //2.RAC写法 [arrs.rac_sequence.signal subscribeNext:^ { //遍历RAC字典 FlagItem *item = [FlagItem flagWithDict:x]; [items addObject:item]; }]; //3.高级RAC写法 // map:映射的意思,目的:把原始值value映射成一个新值 // array: 把集合转换成数组 // 底层实现:当信号被订阅,会遍历集合中的原始值,映射成新值,并且保存到新的数组里。 NSArray *flags = [[arrs.rac_sequence map:^id { return [FlagItem flagWithDict:value]; }] array]; NSLog(@"%@",flags); 

5929皇家赌场 1

创办并订阅响应action的信号。 通常command是由UI接触的,像三个按键被点击时。当command被触发时,控件会⾃自动被禁⽤。

Snip20150925_2.png

有多少变动使用RACSignal 有事件管理须求RACCommand

5929皇家赌场 2

RACCommand规划观念:内部signalBlock为什么要回去贰个实信号,那个实信号有何用。

Snip20151225_4.png

  • 在RAC开垦中,常常会把网络央求封装到RACCommand,直接实行有些RACCommand就能够发送乞请。

  • RACCommand当中须要到数码的时候,须要把央浼的数量传递给外部,这个时候就须求通过signalBlock归来的时域信号传递了。

5929皇家赌场 3

应用情形,监听开关点击,互连网恳求

Snip20150925_1.png

 //1.创建命令 RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * { NSLog; // signalBlock必须要返回一个信号,不能传nil,如果不想要传递信号,直接创建空的信号。 //return [RACSignal empty]; //2.创建信号,用来传递数据 return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [subscriber sendNext:@"请求数据"]; //RACCommand中信号如果数据传递完,必须调用[subscriber sendCompleted],这时命令才会执行完毕,否则永远处于执行中。 [subscriber sendCompleted]; return nil; }]; }]; //RACCommand需要被强引用,否则接收不到RACCommand中的信号,因此RACCommand中的信号是延迟发送的。 _command = command; //3.订阅信号 [command.executionSignals subscribeNext:^ { [x subscribeNext:^ { NSLog; }]; }]; //RAC高级用法: // switchToLatest:用于signal of signals,获取signal of signals发出的最新信号,也就是可以直接拿到RACCommand中的信号,不需要订阅信号 [command.executionSignals.switchToLatest subscribeNext:^ { NSLog; }]; //监听命令是否执行完毕,默认会来一次,可以直接跳过,skip表示跳过第一次命令 [[command.executing skip:1] subscribeNext:^ { if ([x boolValue] == YES) { NSLog; }else{ NSLog; } }]; //4.执行命令 [self.command execute:nil]; 

5929皇家赌场 4

用来当贰个非功率信号,被每每订阅时,为了确认保障开创频限信号时,防止频仍调用创设功率信号中的block,产生副成效,能够应用那么些类管理。比方:当有2个RACSignal订阅信心的时候,就需求发送五次RACSiagnal的时限信号,施行一回block操作。而使用RACMulticastConnection连接,对signal pulish管理就不会反复创设。

Snip20151225_5.png

 //1.创建信号a RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { NSLog; [subscriber sendNext:@1]; return nil; }]; //2,创建连接 RACMulticastConnection *connect = [signal publish]; //3.订阅信号。即使订阅了,还没激活信号 [connect.signal subscribeNext:^ { NSLog(@"订阅者第一信号"); }]; [connect.signal subscribeNext:^ { NSLog(@"订阅者第二信号"); }]; //4.连接,激活信号 [connect connect];

5929皇家赌场 5

  • 代替他代理:rac_signalForSelector:用于代替代理。

  • 代替KVO :rac_valuesAndChangesForKeyPath:用以监听某些对象的脾气改换。

  • 监听事件:rac_signalForControlEvents:用于监听有个别事件。

  • 代表公告:rac_addObserverForName:用来监听有个别文告。

  • 监听文本框文字改动:rac_textSignal:如若文本框发出改培育能够时有爆发这么些功率信号。

  • 管理当分界面有多次诉求时,必要都收获到数码时,本事突显界面

  • rac_liftSelector:withSignalsFromArray:Signals:当传入的Signals,每一个signal都至少sendNext过一遍,就能够去接触第三个selector参数的点子。使用注意:多少个时域信号,参数一的主意就多少个参数,每一个参数对应非功率信号发出的数据。

Paste_Image.png

3.4响应式编制程序观念:没有必要寻思调用顺序,只要求领悟思谋结果,近似于连锁反应,发生三个事变,会耳闻则诵相当多事物,那些事件像流同样的散布出去,然后影响结果,借用面向对象的一句话,万物都已流。

// 1.代替代理// 需求:自定义redView,监听红色view中按钮点击// 之前都是需要通过代理监听,给红色View添加一个代理属性,点击按钮的时候,通知代理做事情// rac_signalForSelector:把调用某个对象的方法的信息转换成信号,就要调用这个方法,就会发送信号。// 这里表示只要redV调用btnClick:,就会发出信号,订阅就好了。[[redV rac_signalForSelector:@selector(btnClick:)] subscribeNext:^ { NSLog(@"点击红色按钮");}];// 2.KVO// 把监听redV的center属性改变转换成信号,只要值改变就会发送信号// observer:可以传入nil[[redV rac_valuesAndChangesForKeyPath:@"center" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^ { NSLog; }];// 3.监听事件// 把按钮点击事件转换为信号,点击按钮,就会发送信号[[self.btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^ { NSLog(@"按钮被点击了");}];// 4.代替通知// 把监听到的通知转换信号[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^ { NSLog;}];// 5.监听文本框的文字改变[_textField.rac_textSignal subscribeNext:^ { NSLog(@"文字改变了%@",x);}];// 6.处理多个请求,都返回结果的时候,统一做处理.RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { // 发送请求1 [subscriber sendNext:@"发送请求1"]; return nil;}];RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { // 发送请求2 [subscriber sendNext:@"发送请求2"]; return nil;}];// 使用注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据。[self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]];}// 更新UI- updateUIWithR1:data r2:data1{ NSLog(@"更新UI%@ %@",data,data1);}

代表:KVO运用。

3.5函数式编制程序观念:是把操作尽量写成一连串嵌套的函数也许措施调用。

函数式编程特点:各类方法必得有重回值(本身对象),把函数大概Block当做参数,block参数(须要操作的值)block再次来到值(操作结果)

代表:ReactiveCocoa。

用函数式编程达成,写二个加法总计器,何况加法计算器自带决断是或不是等于某些值.

5929皇家赌场 6

Paste_Image.png

5929皇家赌场 7

Paste_Image.png

4.ReactiveCocoa编制程序观念

ReactiveCocoa结合了二种编制程序风格:

本文由68399皇家赌场发布于集成介绍,转载请注明出处:5929皇家赌场:iOS开发 —— ReactiveCocoa详解

关键词: 68399皇家赌场 iOS 详解 ReactiveCoco iOS学习笔记

最火资讯