用块替换委托
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。
我最近开始学习 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。