【问题标题】:Is it possible to extend an existing Objective-C Block?是否可以扩展现有的 Objective-C 块?
【发布时间】:2011-11-07 16:12:45
【问题描述】:

我有一个使用像这样在标题中定义的 Block 的类:

@property (readwrite, copy) RequestSucceededBlock succeededBlock;

属性succeededBlock 已经设置了一个块。有没有办法用另一个仍然调用原始的 Block 覆盖这个 Block,类似于类继承?

我认为这是不可能的,因为应该使用类继承来表达这样的事情。还有可能吗?

【问题讨论】:

  • 就在我的脑海中,将前一个块的另一个副本复制到某个可访问的地方,然后从后一个块调用它?

标签: objective-c inheritance objective-c-blocks


【解决方案1】:

假设您正在谈论尝试在仍调用超类块的子类中使用替换块,您无法将块注入现有块,但您可以按如下方式伪造它:

// 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;
}

这有点奇怪,尽管它假设超类有一个默认块分配给您要调度的succeededBlock。如果您的问题有不同的用途,请澄清一下,我会看看是否可以更新。

编辑:将copy 添加到 iVar

【讨论】:

  • 不应该将combinedBlock块复制到iVar中吗?
  • 我期待着尝试一下。我认为,考虑到所有因素,它就像你能得到的一样优雅......很好的答案。
猜你喜欢
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 2013-01-06
相关资源
最近更新 更多