zoukankan      html  css  js  c++  java
  • iOS 中的 Block

    参考:链接

     (1)block作为本地变量(local variable)

    returnType (^blockName)(parameterTypes) = ^returnType(parameters){...};

    (2)block作为类的成员属性(@property)

    @property (nonatomic, copy) returnType (^blockName)(parameters);

    这时候可以类比delegate,实现代理功能。

    (3)block作为函数参数(method parameter)

    - (void)someMethodThatTakesABlock:(returnType (^)(parameterTypes))blockName;

    调用包括block参数的函数,

    [someObject somethodThatTakesABlock:^returnType(parameters){...}];

    (4)使用typedef定义block类型

    typedef returnType (^TypeName)(parameterTypes);

    TypeName blockName = ^returnType(parameters){...};

    上面的内容翻译自fuckblocksyntax,大家忘了block语法的时候可以反复的看看。

    Block的使用举例,

    (1)作为本地变量

    int (^Mutiply)(int,int) = ^(int num1,int num2){

        return num1*num2;

    };

    block可以访问局部变量,但是不能修改,否则会编译报错,

    int mutiplier = 7;

    int (^myBlock)(int) = ^(int num){

        mutiplier++;//编译报错

        return num*mutiplier;

    };

    如果要在block内部修改局部变量,则需要使用__block来修饰该局部变量,如下,

    __block int mutiplier = 7;

    int (^myBlock)(int) = ^(int num){

        mutiplier++;//编译不会报错

        return num*mutiplier;

    };

    (2)作为函数参数使用

    作为函数的参数,block某种意义上替代了回调函数或者delegate,当函数调用的时候,假设某个事件发生,这时候block里面的内容就会运行。这样有利于代码的整合和阅读,不需要到处去实现委托方法了。

    Block作为函数参数,到底该怎么写代码呢?今天(2014.05.09)晚上突然想明白,只要坚定的把Block当做delegate,一切就很简单了,我们先看看delegate作为参数,是怎么写的吧,如下代码,

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"点击Cell" delegate:selfcancelButtonTitle:@"确定" otherButtonTitles:nil, nil];

    [alert show];

    这里是初始化一个alert并且让alert弹出,让我们看看初始化的-(void)initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:是怎么定义的吧,如下代码,

    - (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id /*<UIAlertViewDelegate>*/)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION;//Xcode中复制过来的

    我特别把delegate参数用红色注明,所以是不是有了一点怎样去定义block作为参数的灵感,下面我就写完整的代码,分享我自己的经验吧,

    首先,还是要说一个场景,自定义的cell上面有一个Button,点击Button,调用在ViewController中的-(void)OperateLog:方法,

    不多说了,上代码,

    ImageTableViewCell.h file

    typedef void (^BtnBlock)();//定义一个block

    @interface ImageTableViewCell:UITableViewCell

    {

        BtnBlock _btnBlock;//定义一个block成员变量

    }

    //下面是两个xib拖动的控件

    @property (nonatomic, strong) IBOutlet UIButton *btn;

    @property (nonatomic, strong) IBOutlet UIIageView *imgView;

    - (void)configureCell:(UITableViewCellStyle)style Block:(BtnBlock)block reuseIdentifier:(NSString *)reuseIdentifier;

    //点击Button触发的方法

    - (IBAction)btnClicked:(id)sender;

    @end

    ImageTableViewCell.m file

    @implementation ImageTableViewCell

    //...省略无关代码

    - (void)configureCell:(UITableViewCellStyle)style Block:(BtnBlock)block reuseIdentifier:(NSString *)reuseIdentifier

    {

        //...省略不相干代码

        _btnBlock = block;

    }

    - (IBAction)btnClicked:(id)sender

    {

        if(_btnBlock)

        {

            _btnBlock();

        }

    }

    ViewController.m file

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    {

        NSString *simpleIdentify = @"UITableViewCellIdentify";

        ImageTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleIdentify];

        if (!cell) {

            //将Custom.xib中的所有对象载入

            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ImageTableViewCell" owner:self options:nil];

            //第一个对象就是CustomCell了

            cell = [nib objectAtIndex:0];

            [cell configureCell:UITableViewCellStyleDefault Block:^{

                [self OperateLog];

            } reuseIdentifier:simpleIdentify];

        }

        return cell;

    }

    //button点击,最终传递到OperateLog方法,相当于代理方法吧

    - (void)OperateLog

    {

        NSLog(@"点击了cell上面的Button");

    }

  • 相关阅读:
    五大常用算法之四:回溯法
    五大常用算法之三:贪心算法
    五大常用算法之二:动态规划算法
    SSH 只能用于远程 Linux 主机?那说明你见识太小了!
    通过Heketi管理GlusterFS为K8S集群提供持久化存储
    php大文件(视频)分片上传
    php大文件(视频)上传讨论
    php大文件(视频)上传分享
    php大文件(视频)上传问题
    php大文件(视频)上传方法
  • 原文地址:https://www.cnblogs.com/benpaobadaniu/p/4893748.html
Copyright © 2011-2022 走看看