OC3大回调模式使用总结(三)block回调

OC 3大回调模式使用总结(三)block回调

block 又称 代码块,闭包等

是一个匿名的函数,它可以当做一个对象来使用,只不过这个对象很特殊,是一段代码,他可以保存你写的一段预备性质代码,待某个不确定的事件发生时再调用;事件发生时,它可能会给你传递一些状态参数(回传),来方便你的使用

block常用类型(可以看做一个匿名函数的类型):

typedef int(^Add)(int,int);//定义一个block类型
typedef void(^Logg)(NSString *);//有一个参数,但是没有返回值的
typedef void(^FFF)(void);//没有参数也没有返回值

block外部变量(可以被block引用)

   NSString *s1 = @"你好外部变量1";
     __block   int ccc = 2;//__block修饰的变量可以在代码块内部改变,否则是不可以改变的

使用上述的3中block类型,定义3个block变量,可以当做函数使用

      Add aa = ^(int a,int b)//定义一个block变量,变量的值是一段代码
        {

            NSLog(@"s1 = %@",s1);//捕获外部变量
            NSLog(@"ccc = %d",ccc);
            ccc++;//默认外部变量是只读的,除非加上__block
            return a+b;
        };

        NSLog(@"%d",aa(1,2));//调用aa 代码块
        
Logg lo = ^(NSString *str)
        {
            NSLog(@"打印字符串!%@",str);
        };

        lo(@"没有返回值的block测试!");
FFF f = ^(){NSLog(@"s1 = %@",s1);ccc++;};
        f();//没有参数的block使用

block的使用场景:

1.网络请求的回调
2.封装自定义的组件
3.反向传值
4.其他

block的特点:block中可以捕获其他对象的属性和方法,作用域很大;我们在(3)中进行说明

(1)如果你使用过AFNetworking或者ASIHttpRequest你不会对第1种使用场景产生任何疑问,对于网络请求的成功或者失败的操作,都是需要时间的,都是异步的操作;所以,你需要提前写好操作代码,待某个状态到达的时候会则自动调用这段代码;例如你提前写好网络请求成功之后的block块,该block可能包含一些参数,这些参数是请求成功或者失败之后的参数,可以让你对这些参数进行处理

例如AFNetworking的使用,对于成功或者失败之后的处理都是使用了block

成功之后的执行的block

 success:^(AFHTTPRequestOperation *operation, id responseObject) {}

失败之后执行的block

 failure:^(AFHTTPRequestOperation *operation, NSError *error) {//失败之后的block块 }

/*

* 开启一个异步网络请求,成功或失败后,会执行你写的代码

*/

AFHTTPRequestOperation *op = [self.afMannager GET:url parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {//成功后其返回成功的状态参数,供你使用
        NSArray *arr = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];//JSON解析
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
  //失败之后的block块,处理失败操作
    }];
    op.responseSerializer = [AFHTTPResponseSerializer serializer];
    [op start];//开始请求

(2)你也可以自己封装一些组件,然后给外界一些处理事件的接口,这个时候你也可以使用block回调模式;只需要外界传入他的处理代码,那么这个组件在达到这个状态的时候,就会自动调用你写的代码.

(3)反向传值,例如两个界面A,B;点击A界面上的按钮跳到B 编辑界面,B编辑界面在返回时需要传给A界面一些字符串,这个过程是反向传值;这个时候我们可以使用block模式来实现.

在A类中,我们可以预设B界面返回时的代码,即使用block,注意到在B返回时,这个事件需要汇报B自身的状态,即B要汇报一些有用的参数(字符串),那么block需要有一个参数,该参数就是B返回时传来的

代码示例:

A中给B预设返回时的代码块,也就是说B 的代码块获得了A的属性和方法,B在状态改变时会调用该block改变A
   A.m
    [B setTapSaveBlock:^(NSString *str) {
                  [self.btn_Hobby setTitle:str forState:UIControlStateNormal];
            }];
[self.navigationController pushViewController:B animated:YES];//从A 推到B 界面

描述: A推到B界面之前,首先给B设置返回时的代码,该代码用于返回B的参数str,该代码用于调用A的某些属性或者方法

效果:在B的block控制了A的某些属性和方法,且B能汇报自己的状态给A(也就是block的参数);A的属性拿到B的参数后可能将该参数用于配置A,从而达到了反向传值的目的,把B的值传给了A

效果演示:

A界面:

点击我的昵称,签名,兴趣爱好会推到一个新的界面B:

B 界面:

在B编辑完成,之后需要把最新的文本,回传给A; 也就是关闭 B界面时,A上需要显示B传给A的 字符串,这个过程就包含由B到A的反向传值过程

更多相关文章:http://blog.csdn.net/yangbingbinga/article/category/2437601

时间: 2024-10-04 22:38:35

OC3大回调模式使用总结(三)block回调的相关文章

IOS开发之自定义Button(集成三种回调模式)

前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调,Block回调.具体的内容请参考之前的博客:“Objective-C中的Block回调模式”,“Target-Action回调模式”,“Objective-C中的委托(代理)模式”.在接下来要封装的button中将要用到上面的知识点.之前在做新浪微博中的Cell的时候用到了Block回调来确定是那

OC教程6-代码块block回调

OC6-代码块回调 本章教程主要对代码块回调模式进行讲解,已经分析其他回调的各种优缺点和适合的使用场景. 代码块机制 Block变量类型 Block代码封装及调用 Block变量对普通变量作用域的影响 Block回调接口使用 1,代码块机制 苹果公司在iOS4 SDK中首次支持代码块机制,随后代码块机制被广泛应用于各种编码场景,最常见的为回调机制,也成为Block回调. 代码块也称Block.是封装代码的一种机制,也可以称为匿名函数. 使用这种机制可以将一段代码放入一个Block变量中进行存储,

微信开发-回调模式

前言 越来越多的企业借助微信平台做开发,下面记录最近开发微信项目(企业号)一些关键设置.原理及代码 一:添加应用 关注企业微信号后,点击企业号,能看到该企业号下的应用列表,它类似我们常见后台中的模块或栏目,首先我们要创建自己的应用. 二:设置应用为回调模式 创建好应用后,把应用设置成回调模式,按要求设置回调URL及密钥.保存时它会访问URL,只有URL能正确访问信息时才能保存成功,否则一直会提示失败 原理 以下摘自微信开发文档: 验证URL有效性 当你提交以上信息时,企业号将发送GET请求到填写

精读JavaScript模式(五),函数的回调、闭包与重写模式

一.前言 今天地铁上,看到很多拖着行李箱的路人,想回家了. 在上篇博客结尾,记录到了函数的几种创建方式,简单说了下创建差异,以及不同浏览器对于name属性的支持,这篇博客将从第四章函数的回调模式说起.我想了想,还是把一篇博客的知识点控制在五个以内,太长了我自己都懒得看,而且显得特别混杂.标题还是简要说下介绍了哪些知识,也方便自己以后查阅,那么开始. 二.函数的回调模式 1.什么是函数回调模式? 当调用函数时,我们可以将函数作为参数传入到需要调用的函数中,例如我们为函数A传入一个函数B,当函数A执

回调模式【其他模式】

回调模式 @Slf4j public class CallBack { /** * 回调模式更适合于函数式编程语言. */ @Test public void all() { final SimpleTask task = new SimpleTask(); task.execute(r -> { log.info("do callback"); assertEquals("hello", r); }); } } // 1)定义回调接口 interface I

OC3大回调模式使用总结(二)委托模式回调

OC 3大回调模式使用总结(二)委托模式回调 1.委托模式回调 主要用于 UITableView(UITableViewController),UICollectionView,UIPickerView,UITextField,UITextField 这几类控件,是使用委托模式封装的,使用方法和按钮类的控件不一样 委托模式,实际上也是一种对自身状态的汇报机制,某个状态或者事件的变化是不确定时间发生的,但是发生的时候就就得有某些应对措施,这些应对措施是提前写在协议中的; 与目标动作回调不同的是,委

OC3大回调模式使用总结(一)目标动作回调

OC 3大回调模式使用总结(一)目标动作回调 1.目标动作主要用于 (UIButton ,UIStepper,UISwitch,UISegmentControl,UISlider) ,是用来监听按钮等类似控件状态的编程模式,该模式产生的原因是 某些事件是不确定何时会发生,但是发生的时候就需要这么去处理,所以你需要提前写好处理这个事件的代码,当这个事件发生时,系统会调用你写的预备性质的代码(相当于预防性措施) 2.事件: UIButton对应的事件是:UIControlEventTouchUpIn

.net之微信企业号开发(三) 回调模式的接口开发

一.前言 微信企业号应用中,有两种模式,一种是普通模式,这种模式只能进行简单网页链接,以及发送固定的消息.为了可以让企业号的用户更好的与应用交互,微信提供了回调模式,这种回调模式的可以将用户发送给微信的信息,转发到用户提供的一个回调接口上,该接口解析用户发送过来的信息,解析后进行相应,而且回调模式中,可以调用的东西不少,扫码,图片,视频,地理位置信息等. 在应用的模式下,选择回调模式,之后,需要设置3个参数(1.回调接口URL:2.token:3.ASESKey),URL就是提供的回调接口,微信

iOS_Swift初识之使用三种回调方式自定义Button

最近在学习Swift ,发现青玉伏案大神早期用OC写的一篇博客--IOS开发之自定义Button(集成三种回调模式)  很适合用来熟悉Swift的回调方式,于是我就用Swift翻版了一下,具体实现原理就不多说了,主要贴上Swift的代码给大家看看.由于刚开始了解Swift,有使用不恰当的地方请轻拍.... 上代码: 1.新建一个xib,拖一个UIView到界面上,绑定上自定义的UIView类,拖一个UILabel到view上,写上Button假装是个UIButton:并将label拖到代码当中