Block,简单使用和介绍

1.简介:
Block的构成

^(传入参数列){行为主体};
如:
int (^myBlock) (int a,int b) = ^(int a,int b){  
       return a+b;  
   };
//“^”修饰myBlock,说明myBlock是一个block(变量或者函数),“int a,int b”是形参,前面的“int”为返回值类型,{}里面为方法主体;说明这个函数被调用的话,会根据传入的实参a和b计算并返回a+b的值,这里很容易理解

Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成: ^(void)。

(1)在类中,定义一个Block变量,就像定义一个函数;
(2)Block可以定义在方法内部,也可以定义在方法外部 ,具体区别就是其作用范围;
(3)只有调用Block时候,才会执行其{}体内的代码;

2.
Block可以访问局部变量,但是不能修改。比如下面的代码就会报编译错

int num = 0;  
    //使用block   
    int (^myBlock) (int a,int b) = ^(int a,int b){  
        num = a+b;  
        return num;  
    };

这个时候有一个解决方法:如果要修改就要加关键字:_block 是两个下划线”“写在一起

__block int num = 0;  
    //使用block   
    int (^myBlock) (int a,int b) = ^(int a,int b){  
        num = a+b;  
        return num;  
    };  

作为函数的参数,blocks某种意义上替代了回调函数或者delegate。当函数调用了,假设某个事件触发,这时block里的内容就会运行。这其实是一个异步执行代码的过程,调用了这个方法就相当于通知方法体内部的代码执行,只要我通知到位了,我就可以去做别的事情,而不用等待你给我返回一个值(或者没有返回值),这个地方用得最多的就是网络请求,因为网络请求通常可能会很慢,我们不能因为进行网络请求就让界面卡住,所以主线程中明显不能写网络请求,就可以写在block方法里面。

3.简单的界面传值:
在第二个视图控制器的.h文件中定义声明Block属性

typedef void (^ReturnTextBlock)(NSString *showText);
@interface TextFieldViewController : UIViewController
@property (nonatomic, copy) ReturnTextBlock returnTextBlock;
- (void)returnText:(ReturnTextBlock)block;
//第一行代码是为要声明的Block重新定义了一个名字ReturnTextBlock
//第三行是定义的一个Block属性
//第四行是一个在第一个界面传进来一个Block语句块的函数,不用也可以,不过加上会减少代码的书写量

实现第二个视图控制器的方法

- (void)returnText:(ReturnTextBlock)block {
  self.returnTextBlock = block;
}
- (void)viewWillDisappear:(BOOL)animated {

  if (self.returnTextBlock != nil) {
    self.returnTextBlock(self.inputTF.text);
  }
}

其中inputTF是视图中的UITextField。
第一个方法就是定义的那个方法,把传进来的Block语句块保存到本类的实例变量returnTextBlock(.h中定义的属性)中,然后寻找一个时机调用,而这个时机就是上面说到的,当视图将要消失的时候,需要重写:

- (void)viewWillDisappear:(BOOL)animated;

在第一个视图中获得第二个视图控制器,并且用第二个视图控制器来调用定义的属性
如下方法中书写:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
  // Get the new view controller using [segue destinationViewController].
  // Pass the selected object to the new view controller.
  TextFieldViewController *tfVC = segue.destinationViewController;

  [tfVC returnText:^(NSString *showText) {
    self.showLabel.text = showText;
  }];
}

*有不懂的地方可以留言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值