zoukankan      html  css  js  c++  java
  • 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];
        };
     
     
  • 相关阅读:
    关于VSCode如何缩进两个空格
    基于vue来开发一个仿饿了么的外卖商城(二)
    在复杂的项目开发中使用结对编程
    第一个博客
    docker容器启动失败解决办法
    windows转mac-开发环境搭建(六):mac上搭建git环境
    windows转mac-开发环境搭建(五):mac上用docker安装并运行mysql
    windows转mac-开发环境搭建(四):mac上搭建node、VS code、idea环境
    windows转mac-开发环境搭建(三):mac上搭建maven环境
    windows转mac-开发环境搭建(二):mac上搭建java环境
  • 原文地址:https://www.cnblogs.com/xiaotian666/p/5728723.html
Copyright © 2011-2022 走看看