2014-01-28 28 views
3

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

+0

可能的重复[在编译时块发生了什么,我可以在运行时创建一个吗?](http://stackoverflow.com/questions/16323089/what-happens-to-a-block-at-编译时和我可以创建一个运行时) – Caleb

回答

3

这可能吗?

不,但您可以创建块的集合并按顺序执行它们。

+0

你会举一个例子给块分配一个集合吗?它是否需要是一个c数组,因为一个块不是一个obj?或者你可以以某种方式将一个块包装在另一个对象中以便存储到NSMutableArray中? – sean

+1

无需包装 - [块是一个Objective-C对象](https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/Blocks/Articles/bxOverview.html#//apple_ref/doc/UID/TP40007502-CH3-SW2)。您可以[将它们存储在NSArray中](http://stackoverflow.com/q/7997666/643383)(或其他Obj-C集合),或者可以创建另一个以两个或更多块为参数并执行它们的块一个又一个,因为dasblinkenlight已经很好地说明了。 – Caleb

+0

我们怎么能知道索引n处的块何时完成,以便我们可以移动到n + 1? – sean

4

这样做的一种方法是创建一个块,在执行自己的功能之前调用块进行“扩展”。

例如,考虑下面的例子,增加了记录功能,以传递到它的任意块:

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

当然 - 只需要创建一个新的模块,这使得利用原有的在你喜欢的任何成分的方式。如果你有block1block2,您可以创建:

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

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

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

只要确保你能正确地复制块。

+0

这实际上不同于将块合并/连接在一起。您仍然有独立的块,每个块都有自己的状态,而不是具有共享状态的单个块。 – Caleb

+0

但是,由于块不透明,“共享状态”意味着什么?即使共享,也无法看到它。 –

+0

准确地说 - 您可以组合使用块,并且可以有一个包含其他块的块,但是不能将两个块合并到一个块中(这是我了解OP所要求的) 。 – Caleb

相关问题