这个块语法有什么作用?

时间:2014-01-27 18:32:55

标签: objective-c

我有这个代码,它是(非常长的)方法签名的一部分:

[...]requestCreator:(NSURLSessionDataTask *(^)(void (^)(NSURLSessionDataTask *, NSError *)))creator {
//
};

我不太明白,参数中没有变量名称,而且之前似乎是一个类型转换。

有人可以打破这种语法并解释这里的行为是什么吗?

2 个答案:

答案 0 :(得分:4)

采用原始方法参数声明:

(NSURLSessionDataTask *(^)(void (^)(NSURLSessionDataTask *, NSError *)))creator

这种声明的形式是(type)identifier。因此,标识符为creator,类型为:

NSURLSessionDataTask *(^)(void (^)(NSURLSessionDataTask *, NSError *))

在局部变量声明中,看起来这可能是更熟悉的格式,而不是:

NSURLSessionDataTask *(^creator)(void (^)(NSURLSessionDataTask *, NSError *))

让我们用一些typedef重做:

typedef void (^TaskErrorHandlerBlock)(NSURLSessionDataTask *, NSError *);
typedef NSURLSessionDataTask* (^TaskCreatorBlock)(TaskErrorHandlerBlock);
TaskCreatorBlock creator;

我已经根据我的猜测编造了名称TaskErrorHandlerBlockTaskCreatorBlockTaskCreatorBlock是一个返回NSURLSessionDataTask*的块 - 它创建了这样一个任务对象。它需要TaskErrorHandlerBlock作为输入,这可能是一个块,如果出现错误则调用该块。它将遇到错误的任务和错误本身作为参数。

答案 1 :(得分:2)

它看起来像一个块,它接受另一个获取url会话和错误的块。