2011-11-07 31 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

我期待着尝试一下。我认为,所有事情都考虑到了,它就像你所能得到的那样优雅......非常好的答案。 –