Block作为参数时的使用

Block作为参数使用,常见于各框架之中,比如在封装一个类时,当做什么事情由外界去决定,什么时候调用由自己的类决定时,这时候就需要将block作为参数使用。


下面我们模仿AFNetworking的manager,以自定义一个简单的工具类CalculatorManager为例:
1.CalculatorManager.h文件

#import <Foundation/Foundation.h>

@interface CalculatorManager : NSObject

/** 计算结果值*/
@property(assign, nonatomic) int result;
+(instancetype)sharedCalculatorManager;

//block作为参数时格式与其它类型定义时一致,都是(类型)变量名,看起来有些晕人
-(void)calculate:(int(^)(int))calculateBlock;

@end

2.CalculatorManager.m文件

#import "CalculatorManager.h"

static CalculatorManager *instance = nil;

@implementation CalculatorManager
//单例(可忽略)
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (instance == nil) {
            instance = [super allocWithZone:zone];
        }
    });
    return instance;
}

+(instancetype)sharedCalculatorManager
{
    return [[self alloc] init];
}

//方法中定义了一个block数据类型参数(返回值为int类型的,且带有一个int类型的形参)
-(void)calculate:(int (^)(int))calculateBlock
{
    //calculateBlock接受外界传入的代码块,也就意味着怎么去操作是由外界调用者决定的
    _result = calculateBlock(_result);//将_result的值作为实参传入
}

@end

3.外界控制器调用

-(void)viewDidLoad {
    [super viewDidLoad];
    
    CalculatorManager *manager = [CalculatorManager sharedCalculatorManager];
    [manager calculate:^int(int i) {
        //参数i自加1,然后返回
        i++;
        return i;
    }];
    NSLog(@"%d",manager.result);//输出结果为1
}

可以看到,工具类CalculcatorManager的计算方法calculate:^int(int)calculateBlock其具体实现,交由了外界的控制器调用者去决定了。虽然有些许绕,但只要搞清楚block的作为参数使用时的格式,理解起来也很快的,如果先前对这类型的用法在理解上抱有疑惑的话,希望这个小例子能帮到您:)

posted on 2016-01-21 22:53  夏鲁鲁  阅读(15046)  评论(0编辑  收藏  举报