首页 > 代码库 > Block_概要和回调上的应用

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在回调上的应用

Block_概要和回调上的应用