问题理解在Objective C中委派模式和callback函数

任何人都可以在目标C中简单地解释委托模式和callback函数。或者可以指向一些可以使这些概念更清晰的文档(用Easy和Basic解释)。 正如我从任何书籍或网站或(苹果开发人员)引用没有任何想法。

我所接触到的所有资源都是为了理解这一点,通过使用我觉得难以消化的术语,使我更加困惑。

任何帮助赞赏。

委托 名词| deligit |

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

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

UIWebView为例。 只要该实例符合UIWebViewDelegate协议,Web视图就可以将责任委托给一个委托,这是承诺的行为,因为Web视图期望代表的行为

代表不时被调用。 embedded委托方法名称是关于调用的信息。

  • webView: should StartLoadWithRequest:navigationType: – 告诉委托,webview想要加载请求,并询问委托是否应该这样做。
  • webView: will StartLoad: – 告诉StartLoad: Web视图开始加载一个页面,这是为时已晚,做任何事情(这是一个假设的方法,实际上不可用,我用它作为一个一致的例子)
  • webView: did FinishLoad: – 告诉委托,networking视图确实加载了一个页面,现在已经完成了。

使用委派的价值在于,您不需要为了调整UIWebView行为而不需要子类。 一个对象也可以作为许多不同网页浏览的代表,甚至可以作为许多不同types的代表。

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

我将尝试用一个例子来解释代表团的价值。

假设你有一张桌子; 该表将显示一些行。 现在假设你想定制这个表反应某个事件的方式,例如select一个特定的行。

在OOP中做这件事的一个常见方法是inheritance一个表基类并覆盖那里的一些方法。

通过委派,您不需要inheritance表基类; 而是使用基类并告诉它将某些消息“转发”给某个其他对象。 这是基本的想法。

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

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

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

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

我给你的关于表格的例子显示了一种委托,我不会比较callback。 无论如何,代表团可以被用作一种先进的回拨scheme。

采取类NSURLConnection ; 它可以用来pipe理asynchronous通信。

asynchronous通信是使用callback的典型情况。

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

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

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

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

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

但是,因为“协议”是可用的,你可以(但不必)使你的委托类与你的视图控制器相同的类。 这在很多情况下简化了你的devise(数据可以很容易地共享等等),但是这样做并不是强制性的“共享”一个类,而是为代表使用一个独特的类。