Block使用

  

1、对block的理解

    >  block是iOS4.0之后出现的,是仿照java中匿名函数所创造的,它是c级别的语法,效率比协议-代理高

 

    >  block的是一个匿名函数(没有名字的函数)

 

    > 我们可以把block变量看做一个OC的变量,只是这个变量指向的是一个函数。

 

   // 我们可以为block变量赋值, 赋值一个匿名函数。

 

 

 

2、对block的使用

   

2.1 最简单的block

//声明一个最简单的block,没有参数和返回值, ^ 是block的特殊符号

    void(^)()  _myFirstBlock;

 

//赋值 (_myFirstBlock是一个block变量, 指向后面大括号所代表的无参的匿名函数)

_myFirstBlock = ^{

        NSLog(@"my first block!");

    };

 

    //调用block,相当于调用赋给block的函数

    _myFirstBlock();

 

 

2.2 带参数和返回值的block

    //声明一个带有两个参数的block,同时有一个返回值

    NSInteger (^_mySecondBlock)(NSInteger a, NSInteger b);

 

    //赋值

    _mySecondBlock = ^(NSInteger a, NSInteger b){

        NSLog(@"my second block!");

        return a + b;

    };

 

    //调用

    NSInteger sum = _mySecondBlock(35, 27);

    NSLog(@"sum:%d",sum);

 

 

 

2.3 使用block实现两个页面的反向传值

       

案例:有两个页面, 一个是视图控制器: QFViewController, 另一个是加在其上面的视图:QFView;

 

说明:QFViewController 给 QFView 传值属于正向传值

  QFView 给 QFViewController 传值属于反向传值

 

实现:从QFView到QFViewController的反向传值;

 

 

 

方法一:通过属性赋值block的方式

 

QFView.h中:

 

#import <UIKit/UIKit.h>

 

//创建一个 void(^)(NSString *returnString) 的别名 MyBlock

typedef void(^)(NSString *string) MyBlock;

 

@interface QFView : UIView

 

//定义一个MyBlock变量block(相当于:void(^ block)(NSString *string))

( 还不懂?那就理解为MyBlock是一个匿名函数类,block是它的一个对象)

@property (nonatomic, strong)MyBlock block;

 

@end

 

 

QFView.m中:

//按钮点击或其他事件触发,需要反向传值,则调用block

-(void)buttonClick:(UIButton *)button

{

    //判断_block不为nil,则调用_block(@“”)反向传值

    if (_block) {

        _block(@"我把这个字符串返回");

    }

}

 

 

QFViewController.m中:

//创建QFView对象

    QFView *view = [[QFView alloc] initWithFrame:self.view.bounds];

    

    //给view中的block赋值一个函数,当view中调用block()时,也就调用了下面方法;

    view.block = ^(NSString *string) {

        NSLog(@"收到QFView传给我的字符串:%@", string);

    };

 

 

 

方法二:通过方法赋值block的方式

 

QFView.h中:

 

#import <UIKit/UIKit.h>

 

//创建一个 void(^)(NSString *returnString) 的别名 MyBlock

typedef void(^MyBlock)(NSString *string);

 

@interface QFView : UIView

{

    MyBlock myBlock;

}

 

//通过方法参数传入block(如有需要还可以带其他参数)

- (void)setText:(NSString *)text MyBlock:(MyBlock)block;

 

@end

 

 

QFView.m中:

 

//通过方法传入block

-(void)setText:(NSString *)text MyBlock:(MyBlock)block

{

    //将外面传入的block 赋值给本类中的成员变量myBlock(可在其他方法中使用)

    myBlock = [block copy];

}

 

//按钮点击或其他事件触发,需要反向传值,则调用myBlock

-(void)buttonClick:(UIButton *)button

{

    //判断myBlock不为nil,则调用myBlock(@“”)反向传值

    if (myBlock) {

        myBlock(@"我把这个字符串返回");

    }

}

 

 

QFViewController.m中:

 

    //创建QFView对象

    QFView *view = [[QFView alloc] initWithFrame:self.view.bounds];

    

    //通过view中的方法传入函数赋值给view中myBlock,当view中调用myBlock()时,也就调用了下面方法;

    [view setMyBlock:^(NSString *string) {

        NSLog(@"收到QFView传给我的字符串:%@", string);

    }];

 

posted @ 2015-04-07 18:07  merciless  阅读(156)  评论(0编辑  收藏  举报