客户端通过网络接收消息的设计建议
问题描述:
我正在对通过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。如果您的消息调度程序基本上是整个应用程序的一部分,并且不在其他地方使用,它可能不值得。