1

TCP 経由でサーバーから一連の異なるメッセージを受信するクライアントをプログラミングしています。サーバーに接続し、NSData チャンクの形式でメッセージを受信できる簡単なテスト クラスを作成しました。しかし今、私はここから先に進む方法に行き詰まっており、いくつかの設計提案が必要です.

私が持っている 1 つのアイデアは、メッセージごとに、受信したメッセージの種類とメッセージを含むオブジェクトをデリゲートに通知するプロトコルを作成することです。

プロトコル

-(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;
        ...
    }
}

しかし、メッセージの量が増えるにつれて、このソリューションは面倒だと思います。これを行うよりきれいな方法はありますか?

4

1 に答える 1

1

新しいタイプのメッセージをシステムに追加するたびに、その特定のタイプを処理する新しいコードを追加します。そこから逃れることはできません。つまり、今すぐ抽象化できるのはディスパッチです。あなたの場合は、switch ステートメントです。

将来、新しいメッセージ タイプがほとんど追加されない場合、最も簡単な方法は、既に使用している方法である可能性があります。毎回新しい「ケース」を追加するだけです。

別のアプローチは、他のコードが「リスナー」/「コールバック」として登録できるようにすることです。これにより、ディスパッチが一般的になります。ロジックは次のようになります。

  • メッセージの種類を見つける
  • 登録されているすべてのコールバック/リスナーにディスパッチ

新しい「問題」は次のとおりです。ある時点で各リスナーを登録する必要があります。これは、ある種の初期化中に行われます。メッセージ ディスパッチャが基本的にアプリ全体の一部であり、他の場所で使用されない場合は、価値がないかもしれません。

于 2013-02-25T16:43:53.137 に答える