Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何通过typedef';d块作为块的参数,而块本身是方法的参数?_Objective C_Objective C Blocks - Fatal编程技术网

Objective c 如何通过typedef';d块作为块的参数,而块本身是方法的参数?

Objective c 如何通过typedef';d块作为块的参数,而块本身是方法的参数?,objective-c,objective-c-blocks,Objective C,Objective C Blocks,我有一个只接受一个参数的方法。此参数是一个块。 此块本身接受两个参数,它们也是块。他们有 返回无效并接受一个论点的特征 引用一个对象 为了方便起见,让我们键入定义为 另一个街区 typedef void (^MyParamBlock)(id); 然后,获取块的方法如下所示 [self someMethod:^(MyParamBlock pBlock1, MyParamBlock pBlock2) { // . . . } 如何创建要传递给该方法的MyParamBlocks?以下视图控制器

我有一个只接受一个参数的方法。此参数是一个块。 此块本身接受两个参数,它们也是块。他们有 返回无效并接受一个论点的特征 引用一个对象

为了方便起见,让我们键入定义为 另一个街区

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

当前版本的someMethod使用的块包含两个
MyParamBlocks

- (void)someMethod:(void(^)(MyParamBlock, MyParamBlock))block
你可能想要这个

- (void)someMethodWithFirstBlock:(MyParamBlock)firstBlock secondBlock:(MyParamBlock)secondBlock
或者也许

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

当前版本的someMethod使用的块包含两个
MyParamBlocks

- (void)someMethod:(void(^)(MyParamBlock, MyParamBlock))block
你可能想要这个

- (void)someMethodWithFirstBlock:(MyParamBlock)firstBlock secondBlock:(MyParamBlock)secondBlock
或者也许

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

(从我上面的评论:)如果你没有将
pb1
pb2
传递给
someMethod:
,那恰恰相反:
someMethod:
调用传递给
someMethod:
(从我上面的评论:)的块时,你没有传递
pb1
pb2
someMethod:
,正好相反:
someMethod:
调用传递给
someMethod:
的块时,将两个块作为参数传递给该块。在该块中有一些变量阴影。您不会将pb1、pb2传递给
someMethod
,另一种方法是:
someMethod
在调用传递给
someMethod
的块时,将两个块作为参数传递-也许你可以举一个更具体的例子来说明你想要达到的目标。@MartinR-谢谢你的帮助。我接受这个答案。基本上,我误解了我正在阅读的一些文档,认为当我只需要调用传递给我的块时,我必须滚动我自己的块。在该块中有一些变量阴影。你不能将pb1、pb2传递给
someMethod
,另一种方法是:
someMethod
在调用传递给
someMethod
的块时,将两个块作为参数传递-也许你可以举一个更具体的例子来说明你想要达到的目标。@MartinR-谢谢你的帮助。我接受这个答案。基本上,我误解了我正在阅读的一些文档,认为当我只需要调用传递给我的文档时,我必须滚动自己的块。