用块替换委托

Replacing Delegates with Blocks

我最近开始学习 Objective C 并遇到了 Blocks/Closures。在我看来,它们很像 Java 中的 Annonymous inner 类。我在某处读到 Blocks 可以用来代替 Delegates。这让我感到困惑,因为在委托的情况下,您会在特定任务完成时向方法发出信号,委托如何被块替换?

例如 Java,代表如下:

button.addClickListener(new ButtonClickEvent(){

    void foo(){
       // some code
    }
});

在这种情况下,ButtonCLickEvent 是一个协议或 Java 术语中的一个接口。 如何用 Objective C 中的块来表示?

如果您询问是否符合特定委托协议的对象已在其他对象中设置为 delegate,是否可以在一些 simple[= 之后用块替换34=]摆弄,我会说答案是否定的。

Blocks 只是某种可以用作回调的增强函数指针。 Java 中没有互惠概念,甚至 java8 的 函数对象 也没有,因为它们是实际的 Object,只有一个方法(i'我确定您熟悉功能接口的概念。

但这并不意味着 blocks 不能用作响应事件的回调,但是您需要某种适配器,它将特定委托协议指定的常用委托方法转发给您配置的回调块。

ReactiveCocoa 提供了构建此类内容的一个非常好的示例,使用它您将能够执行以下操作:

self.button.rac_command = [[RACCommand alloc] initWithSignalBlock:^(id _) {
    NSLog(@"button was pressed!");
    return [RACSignal empty];
}];

我不会在这里解释它是如何工作的(RACSignal 是表示事件流的抽象),但我想你可以很容易地理解它的作用,非常紧凑。

更新:

有关如何在 Foundation SDK 中实现块的详细信息,请参阅 this post. Also check out this post from Mike Ash with sample usage scenarios

我认为最好使用图书馆。

例如,SHUIKitBlocks.

如果您需要按钮块,请选中 SHControlBlocks