我想动态地将代码添加到块变量,或者将块与另一个块合并或连接。这可能吗?
答案 0 :(得分:5)
这样做的一种方法是创建一个块,在执行自己的函数之前调用块进行“扩展”。
例如,考虑以下示例,将日志记录功能添加到传递给它的任意块中:
typedef void (^MyBlock)(int);
-(MyBlock) expand:(MyBlock)nested {
return ^(int x) {
nested(x);
NSLog("The value of x = %d", x);
};
}
调用expand:
生成的块的累积效果是调用原始块,然后是扩展块的操作。您可以更进一步,创建appendBlock
方法:
-(MyBlock) appendBlock:(MyBlock)second toBlock:(MyBlock)first {
return ^(int x) {
first(x);
second(x);
};
}
答案 1 :(得分:3)
这可能吗?
不,但你可以创建一个块集合并按顺序执行它们。
答案 2 :(得分:1)
当然 - 只需创建一个新的块,它可以以您想要的任何组合方式使用原始块。如果您有block1
和block2
,则可以创建:
someCodeBefore = ^myBlockType(block1) {
someCode()
thatIWantBefore();
block1();
}
someCodeAfter = ^myBlockType(block1) {
block1();
someCode()
thatIWantAfterBlock1();
}
composedBlocks = ^myBlockType(block1, block2) {
block1();
block2();
}
只需确保正确复制块。