美文网首页
Block开发使用场景(参数,返回值)

Block开发使用场景(参数,返回值)

作者: cjdale | 来源:发表于2018-07-04 16:55 被阅读0次

    前面介绍了Block用于保存代码,传值的使用场景,这篇blog介绍Block用作方法参数以及返回值

    1、用作参数

    开发中我们最常见的block用作方法参数,是我们要执行一段动画时,使用系统的UIView方法执行动画。

    [UIView animateWithDuration:.5f animations:^{
         NSLog(@"所要做的事");
    }];
    

    block用作方法参数,我们什么时候用block作为方法参数呢?由上面代码所知,我们只需要把我们所要做的事情写在block里面,而不需要知道什么时候去做这些事情。

    总结

    block用作方法参数的时机是:需要做的事情由外部决定,具体什么时候去执行由内部决定。

    假设有种需求,我们需要封装一个计算器,提供一个计算方法,具体是执行加减乘除我们不知,由外部决定。
    代码如下:
    CalcutorManager.h

    @interface CalcutorManager : NSObject
    
    @property (nonatomic,assign) NSInteger result;
     - (void)calcutor:(NSInteger(^)(NSInteger para))block;
    
    @end
    

    CalcutorManager.m

     @implementation CalcutorManager
    
     - (void)calcutor:(NSInteger (^)(NSInteger prar))block {
           if (block) {
               _result = block(_result);
           }
      }
    
     @end
    

    ViewController.m

    CalcutorManager *mgr = [[CalcutorManager alloc] init];
    [mgr calcutor:^NSInteger(NSInteger para) {
        return para += 5;
    }];
    NSLog(@"%ld", mgr.result);
    

    输出结果为:5

    2、用作返回值

    Block用于返回值,最经典的就是Masonry,SDAutoLayout等。

    make.center.mas_equalTo(superView);
    

    链式编程思想,所有的语句用.连接起来,可读性很好。

    我们平时写一个方法,然后去调用,大部分都是用中括号来调用。比如有如下方法:

    - (void(^)(void))test {
         return ^{
        
      };
    }
    //调用
    void(^block)(void) = [self test];
    
    //也可以这样
    self.test();
    

    给上面的需求类CalcutorManager 增加一个实例方法

    - (CalcutorManager *(^)(int))add;
    
    
    - (CalcutorManager *(^)(int))add {
          return ^(int value){
            self.result += value;
            return self;
       };
    }
    

    在外部调用

    mgr.add(5).add(5);
    NSLog(@"%ld", mgr.result);
    

    输入结果为: 10

    相关文章

      网友评论

          本文标题:Block开发使用场景(参数,返回值)

          本文链接:https://www.haomeiwen.com/subject/lizeuftx.html