2011-11-07 29 views
4

我有利用在標頭中定義這樣的塊的類:是否可以擴展現有的Objective-C塊?

@property (readwrite, copy) RequestSucceededBlock succeededBlock; 

屬性succeededBlock已經設置與塊。有沒有一種方法可以將另一個仍然調用原始塊的Block重寫,類似於類繼承?

我認爲這是不可能的,因爲類繼承應該用來表達類似的東西。它仍然有可能嗎?

+3

只是把我的頭頂部,使前半模塊的另一個副本的地方訪問,並從後者塊稱呼呢? –

回答

3

假設你正在談論試圖在仍然調用父塊子類中的替換塊,你不能注入一個塊到現有的塊,但你可以假,如下所示:

// in MySubclass.h 
@property (nonatomic, copy) RequestSucceededBlock subclassSucceededBlock; 

// in MySubclass.m 
- (RequestSucceededBlock)succeededBlock 
{ 
    [return subclassSucceededBlock]; 
} 

- (void)setSucceededBlock:(RequestSucceededBlock)newSucceededBlock 
{ 
    // make sure this conforms to the definition of RequestSucceededBlock 
    RequestSucceededBlock combinedBlock = ^{ 
     dispatch_async(dispatch_get_current_queue(), newSucceededBlock); 
     dispatch_async(dispatch_get_current_queue(), [super succeededBlock]); 
    }; 
    subclassSucceededBlock = combinedBlock; 
} 

雖然b/c假設超類有一個默認塊分配給succeededBlock,但您想分派,但這有些奇怪。如果您的問題有不同的用途請澄清,我會看看我是否可以更新此。

編輯:添加copy到伊娃

+1

combinedBlock塊不應該被複制到iVar中嗎? – nverinaud

+0

是的,謝謝你的糾正。進行編輯。 – XJones

+0

我期待着嘗試一下。我認爲,所有事情都考慮到了,它就像你所能得到的那樣優雅......非常好的答案。 –