2014-01-28 52 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

相關問題