如何将typedef' d块作为参数传递给一个块,它本身就是一个方法的参数?

时间:2014-05-15 18:15:17

标签: objective-c objective-c-blocks

我有一个带一个参数的方法。这个参数是一个块。 该块本身有两个参数,也就是块。他们有 返回虚空的特征并接受一个论点 引用一个对象。

为方便起见,我们要输入作为参数的块 其他街区。

typedef void (^MyParamBlock)(id);

然后,采用块的方法看起来像

[self someMethod:^(MyParamBlock pBlock1, MyParamBlock pBlock2) {
  // . . .
}

如何创建MyParamBlocks以传递给方法?以下视图控制器代码是一个示例。 MyParamBlocks pb1和pb2不会传递给someMethod调用。

//
//  ViewController.m
//  PassingBlocksAsParamsToABlock

#import "ViewController.h"

typedef void (^MyParamBlock)(id);

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    MyParamBlock pb1 = ^(id obj) {
        NSLog(@"%@", obj);
    };

    MyParamBlock pb2 = ^(id obj) {
        NSLog(@"%@", obj);
    };

    [self someMethod:^(MyParamBlock pb1, MyParamBlock pb2) {
        NSString *str = @"strng";
        NSLog(@"%@", str);
        pb1(str);
        pb2(str);
    }];
}

- (void)someMethod:(void(^)(MyParamBlock, MyParamBlock))block
{
    NSLog(@"hallo");

    id pb1 = ^(id value) {
        // . .
    };

    id pb2 = ^(id anotherValue) {
        // . .
    };

    block(pb1, pb2);
}


@end

2 个答案:

答案 0 :(得分:3)

您当前的someMethod版本需要一个需要两个MyParamBlocks的块。

- (void)someMethod:(void(^)(MyParamBlock, MyParamBlock))block

你可能想要这个......

- (void)someMethodWithFirstBlock:(MyParamBlock)firstBlock secondBlock:(MyParamBlock)secondBlock

或者也许......

- (void)someMethodWithParameterBlocks:(NSArray *)parameterBlocks; //of MyParamBlocks

答案 1 :(得分:1)

(来自我的上述评论:) 您不能将pb1pb2传递给someMethod:,这恰恰相反:调用传递给someMethod:的块时,someMethod:传递两个块作为参数。