是"继电器"委托协议Objective-C中的不良做法?

时间:2014-08-07 15:13:49

标签: objective-c delegates protocols

假设我在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犹豫不决,因为我认为委托协议更优雅。然而,这似乎有点像接力赛给我。在这样的场景中,我将非常感谢有关流行惯例的任何信息。

2 个答案:

答案 0 :(得分:1)

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

代表 - 当一个项目对结果感兴趣或者为另一个有关系的项目提供服务时使用

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

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

答案 1 :(得分:1)

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