block的基本使用

一 Block基本常识

1.声明block
声明没有参数没有返回值block
void(^block1)(); block1就是该block数据类型的变量名
有返回值有参数
int(^block2)(int);

2.定义block
2.1 没有参数,没有返回值block的定义

      void(^block1)() = ^{  };

2.2 有参数,有返回值block的定义

  int(^block2)(int) = ^int(int a){ return a  };     ==    int(^block2)(int) = ^(int a){ return a  };   
 = 后面的返回值类型可以省略     
 注意:如果block有返回值,那么代码块中一定要有return

3.block作用
封装(保存)代码块

4.block调用
用变量名+()就可以调用
如果有参数,()内一定要写上 参数的变量名

5.block类型
block的数据类型去掉变量名 就是 block的类型

 例如:void(^block1)()的block类型为   void(^)()
          int(^block2)(int)的Block类型为 : int(^)(int)

6.生成block类型的快捷方式
输入inline + 回车 就会弹出block类型的定义模板

  <#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {        <#statements#>
};
 注意:苹果文档里面说明block是一个对象
 ![](http://upload-images.jianshu.io/upload_images/2557720-b88ff91594815aa0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 

二 block的使用场景

1.block可以作为方法的参数去使用
1.1 为什么把block作为参数使用?
封装一个类,有些事情方法内部不能决定,需要外界决定,那么可以提供block给外界 , 通过block外界就可以把想做的事情传进来
经典案例:动画 和 AFN发送网络请求

  动画:  UIView animateWithDuration:<#(NSTimeInterval)#> animations:<#^(void)animations#>
     [UIView animateWithDuration:2.0 animations:^{
         //在这里写(外界)想做的事情
     }];
AFN: 
mgr GET:<#(nonnull NSString *)#> parameters:<#(nullable id)#> progress:<#^(NSProgress * _Nonnull      downloadProgress)downloadProgress#> success:<#^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)success#> failure:<#^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)failure#>

[mgr GET:XMGBaseUrl parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {        
//这里写(外界)想做的事情        
//参数的作用:内部得到的数据,想要传给外界,就可以通过block的参数来传递                            
//内部对参数赋值,在外界通过这个参数  就能够拿到这个值    
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {        
//这里写(外界)想做的事情
}];

2.block作为成员变量使用

为什么把block作为成员变量:一个类中,有些事情需要外界来决定,就可以提供一个block成员变量,外界通过对blcok赋值,就能把想做的事情传进来

不带参数的block成员变量

声明   @property (nonatomic, copy)void(^task)();

给block赋值 (set方法)

  XTSettingArrowItem *item1 = [XTSettingArrowItem rowItemWithImage:nil title:@"使用兑换码" subTitle:nil];
  item1.task = ^{       
 UIAlertView *alertV = [[UIAlertView alloc] initWithTitle:@"清理缓存" message:@"帮你清理12M" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];        
[alertV show];
  };

带参数的block成员变量

声明   @property(nonatomic,copy) void(^task)(NSIndexPath *indexPath) ;

给block赋值 (set方法)

  XTSettingArrowItem *item1 = [XTSettingArrowItem rowItemWithImage:nil title:@"使用兑换码" subTitle:@"23:00"];
item1.task= ^(NSIndexPath *indexPath){
    UITextField *textF = [[UITextField alloc] init];        
[textF becomeFirstResponder];        
//添加到当前点击的Cell上.        
//获取当前点击的是哪个Cell.        
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    [cell addSubview:textF];
};

你可能感兴趣的:(block的基本使用)