Nsnotification或授权?

时间:2012-11-13 04:19:25

标签: iphone ios xcode delegation

我刚研究了两者,它们似乎都是很好的沟通手段,但是通知似乎更容易处理。在哪些情况下,您希望使用委派而不是nsnotification,以及nsnotification而不是委托?

6 个答案:

答案 0 :(得分:4)

我通常在子系统中的类之间使用委托,但是跨子系统边界使用通知,这些通知不需要直接链接在一起,并且严格的通知顺序并不重要。当一个类需要代表它直接完成某些事情时(比如UITableView一样),我也使用Delegation,以及当行动必须不是直接代表通知者而是为了他们自己的目的而发生时的通知。

通知适用于松散耦合的系统,例如,当您完成登录到服务器并且一堆其他子系统需要知道它可以继续执行他们的任务应该做的任何事情。这些系统可能并非都需要与您的登录子系统建立直接关系,但它们都需要做“某事”。通知也没有像代表那样规定实现的形式,因为通知者不应该关心。

代表在一个更紧密的耦合系统中表现良好,其中可以实现实现(例如,通过执行委托必须遵守的协议来说'现在这样做,然后这样做,然后再说')。如果您正在尝试了解各种代码如何协同工作,则委派也更容易理解,因为可以更清楚地识别关系。

这个主题也是一个很好的post

答案 1 :(得分:2)

是的,我同意NSNotifications比您自己的委托协议和方法更容易实现。我真的不知道这两种方法的相对“成本”(时间或内存使用)是什么,但我使用一种方法的标准如下。

如果多个类需要知道您在第三个类中所做的事情,那么我使用通知,因为它是“广播”,并且注册通知的任何对象都可以获取信息。

另一次我使用通知是因为我有两个对象,比如视图控制器,它们在一系列控制器或链的不同分支上相距很远,因此很难获得对所需控制器的引用把自己定位为代表。

否则,当两个控制器“靠近”时,就像一个控制器创建下一个控制器以准备推送或segue时,我使用委托从推送的视图控制器获取信息回到推送的控制器。

此外,如果控制器需要根据另一个对象中发生的事情做多件事,那么再次委托更好,因为你可以拥有一个具有多种方法的委托协议(例如UITableViewDelegate)。

答案 2 :(得分:1)

在许多iOS视图中,委派很重要,例如UITableView。 UITableView有一个UITableViewDelegate和一个UITableViewDataSource。两者都是提供有关表格内容的信息所必需的。您无法通过通知执行此操作。

使用委托的其他一些地方:

  • avery app有一个应用程序委托:UIApplicationDelegate
  • UIEditView有代表告诉它如何表现。
  • UIAlertView有一个代理人将用户的操作传达给应用程序。

答案 3 :(得分:1)

当事件的接收者数量有限时,委派通常很有用,可能是1或2,如果您想控制事件的传递方式。例如,如果让我们说UIApplicationDelegate示例,则在applicationDidFinishLaunch完成之前,您无法调用applicationDidForeground,这样您就可以确保接收方在下一个事件发送之前确认了每个事件。如果你必须提供像开始,结束,开始,完成等生活方式的事件。代表们会更好。

我脑子里的通知大多就像布尔事件,即使你可以传递数据,如果你不得不广播某个事件而不管接收者是谁,它们都很有用。通常,当您必须传达信息更改时,这非常有用

答案 4 :(得分:1)

首先,我必须说代表比通知快得多。如果在你的项目中你有100个代表团就可以了,但是当你收到100个通知时,它很容易在设备上变得很慢。 但是,代理人有限制:您的对象只能有一个特定类型的委托。在通知的情况下,观察员的数量通常不受限制。此外,委托方法可能在同一个线程上执行,除非您使用特定方法在不同的线程上执行它们。

答案 5 :(得分:1)

只是旁注:两者都是很棒的概念。通知更容易处理 - 特别是在不经过思考的情况下编写不可维护的代码非常容易。

在大多数情况下,良好的架构应该能够让它们在没有它们的情况下生存。

我看过一个更大的iPad项目,其中使用通知来弥补建筑设计中的缺陷:太可怕了。 2个月后代码完全无法维护。

我的经验:它们是一个非常方便的工具 - 如果其他工具失败则使​​用它们