你可以将代码附加到Objective-C块变量吗?

时间:2014-01-28 18:18:29

标签: objective-c objective-c-blocks

我想动态地将代码添加到块变量,或者将块与另一个块合并或连接。这可能吗?

3 个答案:

答案 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)

当然 - 只需创建一个新的块,它可以以您想要的任何组合方式使用原始块。如果您有block1block2,则可以创建:

   someCodeBefore = ^myBlockType(block1) {
     someCode()
     thatIWantBefore();
     block1();
   }

   someCodeAfter = ^myBlockType(block1) {
     block1();
     someCode()
     thatIWantAfterBlock1();
   }

   composedBlocks = ^myBlockType(block1, block2) {
     block1();
     block2();
   }

只需确保正确复制块。