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

block 又称 代码块,闭包等

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

block经常使用类型(能够看做一个匿名函数的类型):

  1. typedef int(^Add)(int,int);//定义一个block类型
  2. typedef void(^Logg)(NSString *);//有一个參数,可是没有返回值的
  3. typedef void(^FFF)(void);//没有參数也没有返回值

block外部变量(能够被block引用)

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

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

  1. Add aa = ^(int a,int b)//定义一个block变量,变量的值是一段代码
  2. {
  3.  
  4. NSLog(@"s1 = %@",s1);//捕获外部变量
  5. NSLog(@"ccc = %d",ccc);
  6. ccc++;//默认外部变量是仅仅读的,除非加上__block
  7. return a+b;
  8. };
  9.  
  10. NSLog(@"%d",aa(1,2));//调用aa 代码块
  1. Logg lo = ^(NSString *str)
  2. {
  3. NSLog(@"打印字符串!%@",str);
  4. };
  5.  
  6. lo(@"没有返回值的block測试!");
  1. FFF f = ^(){NSLog(@"s1 = %@",s1);ccc++;};
  2. f();//没有參数的block使用

block的使用场景:

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

block的特点:block中能够捕获其它对象的属性和方法,作用域非常大;我们在(3)中进行说明

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

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

成功之后的运行的block

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

失败之后运行的block

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

/*

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

*/

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

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

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

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

代码演示样例:

  1. A中给B预设返回时的代码块,也就是说B 的代码块获得了A的属性和方法,B在状态改变时会调用该block改变A
  2. A.m
  3. [B setTapSaveBlock:^(NSString *str) {
  4. [self.btn_Hobby setTitle:str forState:UIControlStateNormal];
  5. }];
  6. [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

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

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

    前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调 ...

  2. Objective-C中的Block回调模式

    在前面的博客中提到了Block的概念和使用方法,个人感觉Block最爽的用法莫过于在回调时用block.感觉比委托回调和目标方法回调用着要顺手,好不好用还得读者亲自用一下才知道.如果 读者之前用过SS ...

  3. 代码块(Block)回调一般阐述

    本章教程主要对代码块回调模式进行讲解,已经分析其他回调的各种优缺点和适合的使用场景. 代码块机制 Block变量类型 Block代码封装及调用 Block变量对普通变量作用域的影响 Block回调接口 ...

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

    一.前言 今天地铁上,看到很多拖着行李箱的路人,想回家了. 在上篇博客结尾,记录到了函数的几种创建方式,简单说了下创建差异,以及不同浏览器对于name属性的支持,这篇博客将从第四章函数的回调模式说起. ...

  5. 63.delegate回调 和block回调

    效果:viewController里面放置一个按钮和Lab,点击按钮进入oneViewController(delegate回调)或者BlockViewController(block回调),两者控制 ...

  6. 微信企业号开发入门(回调模式)java

    最近在开发微信企业号,刚接触时云里雾里的,在摸索过程中终于清晰了一点. 刚开始我以为订阅号.服务号.企业号的接口差不多,就一直用订阅号的教程来入门,后来才发现差的挺多的. 首先,微信企业号不像订阅号和 ...

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

    一.前言 微信企业号应用中,有两种模式,一种是普通模式,这种模式只能进行简单网页链接,以及发送固定的消息.为了可以让企业号的用户更好的与应用交互,微信提供了回调模式,这种回调模式的可以将用户发送给微信 ...

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

    最近在学习Swift ,发现青玉伏案大神早期用OC写的一篇博客--IOS开发之自定义Button(集成三种回调模式)  很适合用来熟悉Swift的回调方式,于是我就用Swift翻版了一下,具体实现原理 ...

  9. IOS常见的三种回调方法介绍

    认识下三种IOS常见的回调模式. 代理模式作为IOS中最常见的通讯模式,代理几乎无处不在. 这里有一个数组,我们首先通过代理的方式将数组传递到其他方法中去. 设置协议及方法 @protocol Cal ...

随机推荐

  1. 解决Sql中DIstinct与Order By共同使用的冲突问题

    1.需求场景: 需要把最新更新文章的前五名作者展示出来. 2.解决问题第一步: select top 5 creator from table order by updateDate desc 结果: ...

  2. S2深入.NET编程总结

    不知从几何时,我也开始变得懒了,以往为了学习的那股子斗劲也早已不在,是时候反思反思了.失败的检测成绩希望可以把我唤醒. 经过总结,在本书中大概学到了这些知识: 1.如果一个类可序列化,则它的子类和包含 ...

  3. eclipse 安装svn插件记录

    每个人都有自己喜欢的和习惯的一套开发环境,其中对于喜欢用eclipse的同学来说.subclipse插件可以说是必不可少的插件了. 他的安装有两种方法,一种是在线安装.然而这种安装实在是太慢了,无法忍 ...

  4. [ Nowcoder Contest 165 #D ] 合法括号序列

    \(\\\) \(Description\) 键盘上有三个键,敲击效果分别是: 在输出序列尾部添加一个左括号 在输出序列尾部添加一个右括号 删除输出序列尾部的第一个元素,若输出序列为空,则什么都不发生 ...

  5. fcc 响应式框架Bootstrap 练习2

    text-primary 属性值使标题直接变成了红色,text-center使标题直接居中 <h2 class="text-primary  text-center"> ...

  6. 【PL/SQL】用星号拼出金字塔

    代码中首先声明了几个变量,然后使用嵌套循环去输出空格和星号,其中: 每层空格数=总层数-该层层数 每层星号数=当前层数*2-1 代码如下: declare v_number1 ); --外层循环控制金 ...

  7. JS高级——逻辑中断

    1.表达式1||表达式2:表达式1为真,返回表达式1:表达式1为假,返回表达式2 2.表达式1&&表达2:表达式1为真,返回表达式2:表达式1为假,返回表达式1

  8. Java常用开源jar包

    转:http://blog.csdn.net/kevingao/article/details/8125683 activation~与javaMail有关的jar包,使用javaMail时应与mai ...

  9. js的hex转base64

    if (!window.atob) { var tableStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456 ...

  10. Day 12 字符串和正则表达式

    使用正则表达式 正则表达式相关知识 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要,正则表达式就是用于描述这些规则的工具,换句话说正则表达式是一种工具,它定义了字符串的匹配 ...