首页 文章

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

提问于
浏览
0

我有一个带一个参数的方法 . 这个参数是一个块 . 该块本身有两个参数,也就是块 . 它们具有返回void并接受引用对象的一个参数的特征 .

为方便起见,我们键入作为另一个块参数的块 .

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 回答

  • 1

    (从我上面的评论:)你没有将 pb1pb2 传递给 someMethod: ,它正好相反: someMethod: 在调用传递给 someMethod: 的块时传递两个块作为参数 .

  • 3

    你当前版本的someMethod需要一个占用两个 MyParamBlocks 的块 .

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

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

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

    或者可能...

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

相关问题