问题理解委托模式和Objective C中的回调函数

时间:2011-08-11 11:38:40

标签: iphone objective-c ios

任何人都可以简单地解释在目标C中委托模式和回调函数。 或者可以指向一些文档(使用简单和基本解释),这些文档可以使这些概念更清晰。因为我从任何书籍或网站或(Apple开发人员)的参考文献中都没有了解它。

我所遇到的所有资源都是通过使用我难以消化的术语让我更加困惑。

感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

我将尝试用一个例子解释委托的价值。

说你有一张桌子;该表将显示一些行。现在假设您想要自定义此表对某些事件的反应方式,例如选择特定行。

在OOP中执行此操作的一种常见方法是继承表基类并覆盖其中的某些方法。

使用委托,您不需要子类化表基类;而是使用基类并告诉它将某些消息“转发”到其他对象。这是基本的想法。

在我们的示例中,当单击该行时,表基类不知道除了将消息发送到您指定为执行该操作的委托的一个对象之外还有什么用。

因此,委托的一个基本优势是您不需要子类。您拥有的另一个优点是委托可以充当其他几个对象的委托。实际上,如果你看一下委托方法的泛型声明,你会看到第一个参数是委托的对象:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

所以当委托收到消息时,它知道是谁发送了消息,以及它应该与哪个对象进行交互。

我给你的关于该表的示例显示了一种委托,我不会将其与回调进行比较。无论如何,可以使用委托以及一种高级的回叫方案。

上课NSURLConnection;它可以用来管理同步通信。

异步通信是使用回调的典型情况。

使用NSURLConnection,委托模式是首选;因此,您可以指定一个对象,而不是指定回调(函数,必须是静态函数或静态类方法)。该对象实现协议定义的方法(NSURLConnectionDelegate协议);你可以看到那些作为一整套回调函数。当NSURLConnection准备好一些数据时,它会调用接口的方法,例如– connection:didReceiveResponse:,以通知它已收到响应。

在这种情况下,重点不在于避免子类化,而是一种更灵活的回调机制(基本上允许更好的封装)。

我希望这有助于澄清这两个概念......

答案 1 :(得分:3)

  

委托 名词| deligit |

     

发送或授权代表他人的人,特别是   当选代表被派往会议。

Cocoa Touch框架(如Foundation或UIKit)中的委托是一个单独的对象实例,受委托监听,并可选择代表委托人决定行为。

UIWebView为例。只要该实例符合UIWebViewDelegate协议,Web视图就可以将责任委托给一个代理,即承诺在Web视图期望代理行为时表现出来。

委托人不时被召唤。嵌入在委托方法名称中的是有关呼叫内容的信息。

  • webView: should StartLoadWithRequest:navigationType: - 告诉代理人webview想要加载请求,并询问代表是否应该这样做。
  • webView: will StartLoad: - 告知代表网页视图开始加载页面,它也是迟到什么(这是一种实际上不可用的假设方法,我用它作为一致的例子)
  • webView: did FinishLoad: - 告知代表网页视图加载页面,现在已完成。

使用委托的价值在于您不需要子类UIWebView来调整其行为方式。一个objkect也可以作为许多不同webview的委托,甚至可以作为许多不同类的代表。

普通UIViewController子类可能符合许多委托协议,例如UITableViewDelegate来响应表中的选择,UIActionSheetDelegate以响应来自操作表的选择等。< / p>

答案 2 :(得分:2)

在Objective-C中,他们对代表做了大量工作,并使它看起来有点特别,但它们只是被调用的对象。唯一的区别是它们的使用方式:将类实例指针传递给某个服务,并在需要某些操作或代码中的数据时通过该实例的指定方法回调(非常类似于使用的回调方案)用其他语言)。

“协议”只是定义委托安排中使用的方法的一种方法。这是一个“穷人的多重继承”方案,几乎与Java中的“接口”概念相同。

但由于“协议”可用,您可以(但不必)使您的委托类与视图控制器相同。这在很多情况下简化了您的设计(数据可以轻松共享等),但是并不是必须以这种方式“共享”类,而不是使用委托的唯一类。