Block_概要和回调上的应用

block是iOS4.0之后新增的特性,现在我们看案列代码都能够看到block的应用。最普遍的就是用作回调。

一.关于block的一些基础信息

1.建立block,看下面两个例子

void (^block)(void);   //这是一个参数void,返回值void的block

void (^block)(int a, char b); //这是一个参数是int和char,返回值void的block

所以记住 ^用来声明一个block

再看几个例子:

1)

int (^block)(int) = ^int(int num) {

return num*3;

};

int a=block(3); //9

2)

int (^block)(int);

block = ^int(int num) {

return num*3;

};

int a=block(3); //9

其实1)等同于2)

2.修改声明在block之外的变量

1)

int x = 123;

int (^block) (int) =^int(int num){

num = x+num;

return num;

};

int a=block(3); //126

2)注意这个是错误示范

int x = 123;

int (^block) (int) =^int(int num){

x = x+num;

return x;

};

3)

__block int x = 123;

int (^block) (int) =^int(int num){

x = x+num;

return x;

};

int a=block(3); //126

2)和3)说明要想修改block之外定义的变量需要加__block

二.下面说说在iOS开发上作为回调功能的应用

拿案例说明

功能很简单,就是点击按钮触发block,改变Label的文字或背景颜色

1.第一步当然是新建工程,然后在IB中拖几个按钮,链接到不一样的方法,再拖一个UILabel建立与代码的联系,这个大家都懂

2.第二步增加两个文件ChangeColor.h和ChangeColor.m

案列一,点击按钮,Label背景变绿色

ChangeColor.h中

typedef void(^GreenColor)(UIColor *colorGreen);

+ (void)ChangeToGreen:(GreenColor)block;

ChangeColor.m中

+ (void)ChangeToGreen:(GreenColor)block{

UIColor *color = [UIColor greenColor];

block(color);

}

ViewController.m相应的按钮方法中

[ChangeColor ChangeToGreen:^(UIColor *colorGreen) {

label.backgroundColor = colorGreen;

}];

案列二,Label背景变蓝

ChangeColor.h中

+ (void)ChangeToBlue:(void(^)(UIColor *colorBlue))block;

ChangeColor.m中

+ (void)ChangeToBlue:(void (^)(UIColor *))block{

UIColor *color = [UIColor blueColor];

block(color);

}

ViewController.m相应的按钮方法中

[ChangeColor ChangeToBlue:^(UIColor *colorBlue) {

label.backgroundColor = colorBlue;

}];

案例一和二的区别就在于typedef,先定义了block

案例三,Label背景变红,并改变文字

ChangeColor.h中

+ (
void
)ChangeToRedAndNewText:(
void
(^)(
UIColor
*colorRed,
NSString
*text))block;

ChangeColor.m中

+ (void)ChangeToRedAndNewText:(void (^)(UIColor *, NSString *))block{

UIColor *color = [UIColor redColor];

NSString *string = @"xxxxxxx";

block(color,string);

}

ViewController.m相应的按钮方法中

[ChangeColor ChangeToRedAndNewText:^(UIColor *colorRed, NSString *text) {

label.backgroundColor = colorRed;

label.text = text;

}];

案例三和之前两个案例的区别是block的参数两个

案列四,Label背景变棕色,文字改变

ChangeColor.h中

+ (void)ChangeWithText:(NSString *)text CallBlock:(void(^)(UIColor *colorBrown, NSString *newText))block;

ChangeColor.m中

+ (void)ChangeWithText:(NSString *)text CallBlock:(void (^)(UIColor *, NSString *))block{

UIColor *color = [UIColor brownColor];

block(color,text);

}

ViewController.m相应的按钮方法中

[ChangeColor ChangeWithText:@"aaaaa" CallBlock:^(UIColor *colorBrown, NSString *newText) {

label.backgroundColor = colorBrown;

label.text = newText;

}];

案列四中的类方法中有一个参数是
(
NSString
 *)text,另一个就是block。所以在回调中,block可以理解为作为参数在使用。

案列五,点击按钮,执行的block参数返回值都是void

ChangeColor.h中

+ (void)NoChange:(void (^)(void))block;

ChangeColor.m中

+ (void)NoChange:(void (^)(void))block{

block();

}

ViewController.m相应的按钮方法中

[ChangeColor NoChange:^{

NSLog(@"NoChange");

}];

案例六,点击的按钮执行的block带返回值

ChangeColor.h中

+ (void)Change:(int (^)(int num))block;

ChangeColor.m中

+ (void)Change:(int (^)(int))block{

int a = block(3);

NSLog(@"%d",a);

}

ViewController.m相应的按钮方法中

[ChangeColor Change:^int(int num) {

return num*3;

}];

案例六,执行后会打印9

这从一到六的案例只是简单地展示了一下block在回调上的应用

时间: 2024-10-09 05:30:49

Block_概要和回调上的应用的相关文章

返回数据给上一个活动

我们都知道,android开发中一个活动跳转时是可以带数据传递给下一个活动的,那么能不能够返回数据给上一个活动呢?答案是肯定的.不过不同的是,返回上一个活动只需要按一下Back键就可以了,并没有一个用于启动活动Intent来传递数据.通过查阅文档你会发现,Activity中还有一个startActivityForResult()方法也是用于启动活动的,但这个方法期望在活动销毁的时候能返回一个结果给上一个活动.毫无疑问,这就是我们所需要的. startActivityForResult()方法接收

回调的原理、实现与应用(1)

什么是回调 上一篇文章中讲了"函数的指针",那么函数指针有什么用呢?一个最常用的地方就是回调. 什么回调?维基百科是这样解释的:回调是一段可执行的代码通过参数传递给别一段代码,以期望在一个合适的时间调用这个参数(可执行的代码). 参考:In computer programming, a callback is a piece of executable code that is passed as an argument to other code, which is expecte

android选择图片或拍照图片上传到服务器(包括上传参数)

From:http://blog.csdn.net/springsky_/article/details/8213898具体上传代码: 1.选择图片和上传界面,包括上传完成和异常的回调监听 [java] view plaincopy package com.spring.sky.image.upload; import java.util.HashMap; import java.util.Map; import android.app.Activity; import android.app.

Java高级技术系列--回调

1.字面意义上的回调 字面意思上理解回调,就是A调用B,B回过头来再调用A,即是回调.既然是这样,当然就要求A中有B,B中有A.如下: <li class="alt"><span><span class="keyword">class</span><span> A {  </span></span></li><li class=""><

IOS开发创建开发证书及发布App应用(四)——创建配置概要文件

4.创建配置概要文件 继续上一篇所讲,今天写的这个是创建配置概要文件 依然在个人中心创建证书这里, 如果不知道的,可以查看以前写的 配置概要文件也分为两种 1)创建开发配置概要文件 2)创建发布配置概要文件 发布配置文件跟开发配置概要文件唯一区别就是选项不同,其余都跟上一步一样,如下图

带你一步步实现线程池异步回调

转载请注明出处 作者:晓渡文章地址:https://greatestrabit.github.io/2016/03/29/callback/ 1.字面意义上的回调 字面意思上理解回调,就是A调用B,B回过头来再调用A,即是回调.既然是这样,当然就要求A中有B,B中有A.如下: class A { /**  * 提出问题  * @author [email protected]  * @param b  * @param question  */ public void ask(final B b

iOS开发-AFNetworking 怎样上传数据? 怎样上传模拟表单

和取数据差不多的 首先定义一个字典,用来存放参数 NSDictionary* params = [NSDictionary dictionary]; params[@"属性"] = 值; 上传字符串数据: //创建请求管理类 AFHTTPRequestOperationManager* mgr = [AFHTTPRequestOperationManager manager]; //发送请求 [mgr POST:url parameters:params success:^(AFHTT

FastDFS的配置、部署与API使用解读(8)FastDFS多种文件上传接口详解(转)

1.StorageClient与StorageClient1的区别 相信使用happy_fish的FastDFS的童鞋们,一定都熟悉StorageClient了,或者你熟悉的是StorageClient1,两者有什么区别呢? 我们在前面的几篇博文中已经知道,FastDFS存储文件时,是将 FastDFS存储到某个Group的某个Storage的某个路径下.如果你在Storage Server上设置的是两层目录结构的话,则一个文件上传到FastDFS后的File ID一般形如"group1/M01

android activity的常用代码:关闭、传值、返回值、回调、网页、地图、短信、电话

Intent intent = new Intent();   intent.setClass(Forward.this, ForwardTarget.class);//forward为当前activity,forwardTarget为新的activity   startActivity(intent);   finish(); Intent用法实例 1.无参数Activity跳转 Intent it = new Intent(Activity.Main.this, Activity2.clas