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

时间:2013-02-25 15:40:26

标签: objective-c network-programming

我正在编写一个客户端,它通过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;
        ...
    }
}

但随着消息量的增长,我觉得这个解决方案很混乱。有没有更漂亮的方法呢?

1 个答案:

答案 0 :(得分:1)

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

如果将来添加的消息类型非常少,最简单的方法可能是您已采用的方法:每次只需添加一个新的“案例”。

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

  • 查找邮件类型
  • 发送给所有已注册的回调/听众

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