【问题标题】:How do you pass typedef'd blocks as params to a block that itself is a parameter to a method?如何将 typedef 的块作为参数传递给本身是方法参数的块?
【发布时间】:2014-05-15 18:15:16
【问题描述】:

我有一个采用一个参数的方法。该参数是一个块。 这个块本身有两个参数,它们也是块。他们有 返回 void 并接受一个参数的特性 引用一个对象。

为方便起见,让我们对作为参数的块进行 typedef 其他块。

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

【问题讨论】:

  • 你在那个块中有一些变量阴影。
  • 您不将 pb1、pb2 传递给 someMethod,相反:someMethod 在调用您传递给 someMethod 的块时传递两个块作为参数。 - 也许您可以展示一个更具体的示例来说明您想要实现的目标。
  • @MartinR - 谢谢你的帮助。我会接受这个作为答案。基本上,我误解了我正在阅读的一些文档,并认为当我只需要调用传回给我的文档时,我必须自己动手。

标签: objective-c objective-c-blocks


【解决方案1】:

您当前版本的 someMethod 采用一个包含两个 MyParamBlocks 的块。

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

你可能想要这个...

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

或许……

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

【讨论】:

    【解决方案2】:

    (来自我上面的评论:) 你没有将pb1pb2 传递给someMethod:,恰恰相反:someMethod: 传递两个块作为参数当调用你传递给someMethod:的块时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 2015-10-14
      • 2017-07-03
      相关资源
      最近更新 更多