客户端通过网络接收消息的设计建议

问题描述:

我正在对通过TCP从服务器接收一组不同消息的客户端进行编程。我创建了一个简单的测试类,它能够连接到服务器并以NSData块的形式接收消息。但现在我被困在如何从这里开始,需要一些设计建议。客户端通过网络接收消息的设计建议

一个想法我是创建一个协议,对于每个消息,通知委托与接收到的消息的类型和包含消息的对象:

协议

-(void)didReceiveLifesign:(LifesignMessage*)message; 
-(void)didReceiveLocation:(LocationMessage*)message; 
... 

分析器

-(void)didReceiveData:(NSData*)data { 
    int type = getType(data); 
    switch(type) { 
     case 0: [self.delegate didReceiveLifesign:parseLifesign(data); break; 
     case 1: [self.delegate didReceiveLocation:parseLocation(data); break; 
     ... 
    } 
} 

但随着消息量的增长我觉得这个解决方案很混乱。有没有更好的方法来做到这一点?

每次向系统中添加新类型的消息时,都会添加新代码来处理该特定类型。你无法摆脱这一点。所以,你现在可以真正抽象出来的地方就是调度:就你的情况而言,switch语句。

如果很少有新的消息类型将在未来添加,最简单的方法可能是你已经采取的最简单的方法:每次只需添加一个新的“案例”。

另一种方法是允许其他代码注册为“侦听器”/“回调”。这使调度通用。逻辑变成:

  • 查找消息类型
  • 发往所有注册的回调/监听器

新的“问题”是:你现在就需要在某些时候注册的每个听众。在某种类型的初始化过程中,这将是sdone。如果您的消息调度程序基本上是整个应用程序的一部分,并且不在其他地方使用,它可能不值得。