我正在编写一个客户端,它通过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;
...
}
}
但随着消息量的增长,我觉得这个解决方案很混乱。有没有更漂亮的方法呢?
答案 0 :(得分:1)
每次向系统添加新类型的消息时,您都将添加新代码来处理该特定类型。你无法摆脱这种局面。所以,你现在真正抽象出来的地方就是调度:在你的情况下是switch语句。
如果将来添加的新消息类型非常少,最简单的方法可能是您已采用的方法:每次只需添加一个新的“案例”。
另一种方法是允许其他代码注册为“监听器”/“回调”。这使得调度通用。逻辑变为:
新的“问题”是:您现在需要在某个时刻注册每个监听器。在某种类型的初始化期间,这将是sdone。如果您的消息调度程序基本上是整个应用程序的一部分,则可能不值得,并且不得在其他地方使用。