Objective-C传递块作为参数

Jac*_*nkr 137 objective-c objective-c-blocks

我怎样才能传递BlockFunction/ Method

我尝试- (void)someFunc:(__Block)someBlock无济于事.

即.什么类型Block

Jon*_*pan 248

块的类型取决于其参数及其返回类型.在一般情况下,块类型的声明方式与函数指针类型相同,但替换为*a ^.将块传递给方法的一种方法如下:

- (void)iterateWidgets:(void (^)(id, int))iteratorBlock;
Run Code Online (Sandbox Code Playgroud)

但正如你所看到的那样,这很麻烦.您可以改为使用a typedef来使块类型更清晰:

typedef void (^ IteratorBlock)(id, int);
Run Code Online (Sandbox Code Playgroud)

然后将该块传递给类似的方法:

- (void)iterateWidgets:(IteratorBlock)iteratorBlock;
Run Code Online (Sandbox Code Playgroud)

  • 你当然可以传递强类型参数,例如`NSNumber*`或`std :: string&`或者你可以作为函数参数传递的任何其他参数.这只是一个例子.(对于除了用`NSNumber`替换`id`之外的等价块,`typedef`将是`typedef void(^ IteratorWithNumberBlock)(NSNumber*,int);`.) (7认同)

Enr*_*iMR 58

这个问题最简单的解释是遵循以下模板:

1.阻止作为方法参数

模板

- (void)aMethodWithBlock:(returnType (^)(parameters))blockName {
        // your code
}
Run Code Online (Sandbox Code Playgroud)

-(void) saveWithCompletionBlock: (void (^)(NSArray *elements, NSError *error))completionBlock{
        // your code
}
Run Code Online (Sandbox Code Playgroud)

案件的其他用途:

2.作为财产阻止

模板

@property (nonatomic, copy) returnType (^blockName)(parameters);
Run Code Online (Sandbox Code Playgroud)

@property (nonatomic,copy)void (^completionBlock)(NSArray *array, NSError *error);
Run Code Online (Sandbox Code Playgroud)

3.阻止作为方法参数

模板

[anObject aMethodWithBlock: ^returnType (parameters) {
    // your code
}];
Run Code Online (Sandbox Code Playgroud)

[self saveWithCompletionBlock:^(NSArray *array, NSError *error) {
    // your code
}];
Run Code Online (Sandbox Code Playgroud)

4.阻止作为局部变量

模板

returnType (^blockName)(parameters) = ^returnType(parameters) {
    // your code
};
Run Code Online (Sandbox Code Playgroud)

void (^completionBlock) (NSArray *array, NSError *error) = ^void(NSArray *array, NSError *error){
    // your code
};
Run Code Online (Sandbox Code Playgroud)

5.阻止作为typedef

模板

typedef returnType (^typeName)(parameters);

typeName blockName = ^(parameters) {
    // your code
}
Run Code Online (Sandbox Code Playgroud)

typedef void(^completionBlock)(NSArray *array, NSError *error);

completionBlock didComplete = ^(NSArray *array, NSError *error){
    // your code
};
Run Code Online (Sandbox Code Playgroud)


qua*_*tym 51

这可能会有所帮助:

- (void)someFunc:(void(^)(void))someBlock;
Run Code Online (Sandbox Code Playgroud)


Ale*_*aev 23

您可以这样做,将块作为块参数传递:

//creating a block named "completion" that will take no arguments and will return void
void(^completion)() = ^() {
    NSLog(@"bbb");
};

//creating a block namd "block" that will take a block as argument and will return void
void(^block)(void(^completion)()) = ^(void(^completion)()) {
    NSLog(@"aaa");
    completion();
};

//invoking block "block" with block "completion" as argument
block(completion);
Run Code Online (Sandbox Code Playgroud)


Dre*_*ren 8

在下面的示例中使用с函数传递块的另一种方法.我创建了在后台和主队列中执行任何操作的函数.

blocks.h文件

void performInBackground(void(^block)(void));
void performOnMainQueue(void(^block)(void));
Run Code Online (Sandbox Code Playgroud)

blocks.m文件

#import "blocks.h"

void performInBackground(void(^block)(void)) {
    if (nil == block) {
        return;
    }

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), block);
}

void performOnMainQueue(void(^block)(void)) {
    if (nil == block) {
        return;
    }

    dispatch_async(dispatch_get_main_queue(), block);
}
Run Code Online (Sandbox Code Playgroud)

比必要时导入blocks.h并调用它:

- (void)loadInBackground {

    performInBackground(^{

        NSLog(@"Loading something in background");
        //loading code

        performOnMainQueue(^{
            //completion hadler code on main queue
        });
    });
}
Run Code Online (Sandbox Code Playgroud)


iiF*_*man 6

如果适用于您,您还可以将块设置为简单属性:

@property (nonatomic, copy) void (^didFinishEditingHandler)(float rating, NSString *reviewString);
Run Code Online (Sandbox Code Playgroud)

确保块属性是"复制"!

当然你也可以使用typedef:

typedef void (^SimpleBlock)(id);

@property (nonatomic, copy) SimpleBlock someActionHandler;
Run Code Online (Sandbox Code Playgroud)


ghe*_*ese 5

您还可以使用常用的c函数语法调用或调用块

-(void)iterateWidgets:(IteratorBlock)iteratorBlock{

    iteratorBlock(someId, someInt);
}
Run Code Online (Sandbox Code Playgroud)

有关块的更多信息

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxGettingStarted.html#//apple_ref/doc/uid/TP40007502-CH7-SW1