3

などのメソッドでタグパラメータを使用する方法を考えています

readDataWithTimeout: tag:
writeData: tag:

タグを使用してパケットのタイプを識別したい場合はどうなりますか? たとえば、tag == 2 は、パケットがクライアントからのメッセージであることを意味し、tag == 1 は、パケットがサーバーからのメッセージであることを意味します...これでよければ、readData: withTag: を呼び出す必要がありますか?数回 (異なるタグごとに 1 回) ?

[readDataWithTimeout:-1 tag:1];
[readDataWithTimeout:-1 tag:2];

「タグを気にせずにすべてのデータを読み取る」と言ってから、 didReadData: withTag: メソッドでタグに従ってデータを処理する方法はありますか?

4

1 に答える 1

6

タグの概念を少し誤解していると思います。読み取り操作は、「2 としてタグ付けされたデータを読み取る」とは言っていません。彼ら、「ネットワークから次のデータを読み取り、将来の参照用に 2 としてタグ付けしてください」と言っています。

タグがネットワーク経由で送信されることはありません。サーバーはデータにタグを付けず、クライアントに送信して読み取らせませんでした。これは、ローカル操作を互いに区別するためにのみ使用される完全にオプションの概念です。つまり、読み取られているデータにはタグがありません。タグは読み取り操作に割り当てるものなので、完了後に後で識別できます。

たとえば、データを一連のヘッダーとペイロードとして読み取っているとします。タグを使用して、ヘッダーの読み取りとペイロードの読み取りを区別できます。

const NSInteger kHeaderTag = 1;
const NSInteger kPayloadTag = 2;

// Assume you know to expect a header, so tag the read operation as such.
[self readDataWithTimeout:-1 tag:kHeaderTag];

// Next assume you know to expect a payload, so tag the read operation as such.
[self readDataWithTimeout:-1 tag:kPayloadTag];

後から特定できるので...

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    if (tag == kHeaderTag)
    {
        // Handle header
    }
    else if (tag == kPayloadTag)
    {
        // Handle payload
    }
}
于 2012-07-17T15:55:34.560 に答える