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是一个对象
     

 

 
二 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赋值 (seto方法)
  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];
    };
 
 

posted on 2016-08-02 11:53  尕小天  阅读(182)  评论(0编辑  收藏  举报

导航