我最近开始学习Objective C并遇到了Block / Closures。它们看起来很像Java中的Annonymous内部类。我在某处读过 Blocks可用于替换Delegates 。这让我感到困惑,因为代表在特定任务完成时发出方法信号,代表如何被Blocks替换?
对于Java中的示例,Delegates类似于:
button.addClickListener(new ButtonClickEvent(){
void foo(){
// some code
}
});
在这种情况下,ButtonCLickEvent是一个协议,或者在Java术语中是一个接口。 如何根据目标C中的块来表示?
答案 0 :(得分:1)
如果您询问符合特定委托协议的对象是否已在某个其他对象中设置为delegate
,则可以在某些简单摆弄后用块替换,我说答案是否定的。
Blocks
只是某种可用作回调的增强函数指针。 Java中没有互惠的概念,甚至java8的功能对象也没有,因为它们只有一种方法是实际的Object
(我确定你熟悉它功能接口的概念)。
但这并不意味着blocks
不能用作响应事件的回调,但是您需要某种适配器来转发特定委托指定的常用Delegate方法已配置的回调块的协议。
建立这样的东西的一个非常好的例子由库ReactiveCocoa表示,使用它你将能够做到这样的事情:
self.button.rac_command = [[RACCommand alloc] initWithSignalBlock:^(id _) {
NSLog(@"button was pressed!");
return [RACSignal empty];
}];
我没有在这里解释它是如何工作的(RACSignal
是一个代表事件流的抽象),但我想你可以很容易地得到它的功能,非常紧凑。
更新:
有关如何在Foundation SDK中实现块的更多信息,请参阅this post。另请查看来自Mike Ash的帖子sample usage scenarios。
答案 1 :(得分:0)