【问题标题】:Problem understanding Delegating pattern & callback functions in Objective C问题理解 在 Objective C 中委托模式和回调函数
【发布时间】:2011-10-24 21:46:35
【问题描述】:

任何人都可以简单地解释一下目标 C 中的委托模式和回调函数吗? 或者可以指向一些文档(带有简单和基本的解释),这些文档可以让我更清楚地了解这些概念。因为我没有从任何书籍或网站或(Apple 开发人员)参考资料中获得任何想法。

为了理解这一点,我遇到的所有资源都让我更加困惑,因为我使用了我觉得难以消化的术语。

感谢任何帮助。

【问题讨论】:

标签: iphone objective-c ios


【解决方案1】:

代表 名词|deligit|

派遣或授权代表他人的人,特别是 被选派代表参加会议。

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

UIWebView为例。只要该实例符合UIWebViewDelegate 协议,Web 视图就可以将责任委托给一个委托,即承诺按照 Web 视图期望委托的行为方式行事

代理不时被调用。嵌入在委托方法名称中的是有关调用内容的信息。

  • webView:shouldStartLoadWithRequest:navigationType: - 告诉代理 webview 想要加载请求,并询问代理是否应该这样做。
  • webView:willStartLoad: - 告诉代理 Web 视图开始加载页面,现在做任何事情都为时已晚(这是一种假设的方法,实际上不可用,我将其用作一致的示例)
  • webView:didFinishLoad: - 告诉代理 Web 视图确实加载了一个页面,现在已经完成。

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

一个普通的UIViewController 子类可能符合许多委托协议,例如UITableViewDelegate 响应表中的选择,UIActionSheetDelegate 响应操作表中的选择等。

【讨论】:

  • 那么,为了避免两个类之间不必要的子类化和强相互依赖,我们使用委托模式的目的是什么?
  • @Viral - 我不会说我们将它用于,但基本上是的。归根结底,它就像 Java 中的回调接口,但更加灵活,并且具有清晰简洁的命名约定。特别是如果您认为协议中的方法可以是可选的,则无需 AbstractInterface 提供默认值,必须/应该用作实现回调的基类。
  • @Viral - 不客气,别忘了接受一些答案,这对你的业力有好处。
【解决方案2】:

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

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

在 OOP 中执行此操作的一种常见方法是子类化表基类并覆盖那里的一些方法。

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

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

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

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

所以当代理接收到消息时,它知道是谁发送的以及它应该与哪个对象交互。

我为您提供的有关表格的示例显示了一种委托,我不会将其与回调进行比较。无论如何,可以使用委托以及一种高级回调方案。

上课NSURLConnection;它可用于管理异步通信。

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

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

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

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

【讨论】:

  • 这意味着 myViewController 的对象是委托对象,而 TableView 是调用(委托方法)didSelectRowAtIndexPath 的委托。我的方法正确吗?
  • 委托对象是调用didSelectRowAtIndexPath的对象,即table view;这样做意味着:向委托人发送消息,委托操作。当用户选择一行时,表格视图不知道该做什么,因此它将这个动作委托给委托对象,即myViewController。委托(控制器)代表委托对象(表格视图)“负责”管理行的选择。
【解决方案3】:

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

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

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

【讨论】:

  • Protocol, DelegatesCallback Routines 在 Objective C 中是否密切相关?
  • 协议描述了委托实现的回调例程。协议是 .h 文件定义。委托是包含各个回调例程的类/实例。
猜你喜欢
  • 1970-01-01
  • 2011-04-12
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
相关资源
最近更新 更多