Objective-C 中的“中继”委托协议是不好的做法吗?

Posted

技术标签:

【中文标题】Objective-C 中的“中继”委托协议是不好的做法吗?【英文标题】:Are "relay" delegate protocols bad practice in Objective-C? 【发布时间】:2014-08-07 15:13:48 【问题描述】:

假设我在 Objective-C 中有三个自定义对象:ClassA: UIViewController <ClassBDelegate>ClassB: NSObject <ClassCDelegate>ClassC: NSObject。 ClassA 是 UIViewController 的子类,它将显示一个活动指示器,直到 ClassC 中发生某个网络事件。 ClassB 在其他类中还有一个 ClassC,负责将事件从 ClassC 中继到 ClassA。 ClassA 有一个 ClassB,ClassB 有一个 ClassC,ClassA 到 ClassC 之间没有直接的联系。

现在让我们说,一旦特定的网络事件发生在 ClassC 中,ClassC 将触发 - (void)someAction;。 ClassB 符合 ClassC 委托协议,调用其- (void)classC:(ClassC *)classC didPerformSomeAction; 方法。反过来,ClassB 触发 -(void)thisOtherAction;,并且由于 ClassA 符合 ClassB 委托协议,它的 -(void)classB:(ClassB *)classB didPerformThisOtherAction; 被调用,这有效地从 ClassC 检索网络事件。

我的问题是,这是不好的做法,如果是,是否有更简单的方法来弥合 ClassA 和 ClassC 之间的差距?我对使用 NSNotification 犹豫不决,因为我认为委托协议更优雅。然而,这对我来说似乎有点像接力赛。在这种情况下,我将不胜感激有关流行约定的任何信息。

【问题讨论】:

直到您可以遵循自己的代码,这没关系 - 但是如果您想避免创建长链,本地通知仍然在这里为您服务。 【参考方案1】:

不要认为委托比通知更优雅,只考虑它们适用于不同的情况:

委托 - 当一个项目对与之有关系的另一个项目的结果感兴趣或提供服务时使用

通知 - 当(可能)多个不同的项目对一个(或多个)事件的发生感兴趣时使用,这些事件由与它们可能或可能没有关系的其他项目发布

这不是 100% 的硬性和快速性。您可以创建一个可以回调许多观察者的委托。您还可以在类之间传递一个块,让其他对象负责委托回调。但是,您的情况似乎更适合通过通知来处理。

【讨论】:

有道理,我会用一个通知看看效果如何【参考方案2】:

您似乎在描述mediator pattern 或adapter pattern。您也可能有middle man 代码气味。这真的取决于你想要达到的目标。

【讨论】:

以上是关于Objective-C 中的“中继”委托协议是不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 上委托 Objective-C 协议

细数Objective-C中的回调机制

Objective-C协议委托不起作用

委托如何工作和委托在objective-c中的工作流程

第23条:通过委托与数据源协议进行对象间通信

Objective-C 中的委托