0

AsyncSocket クラスを使用して、iPhone から Mac にローカル ネットワーク経由でかなり大きな画像を転送しています。ヘッダーでは、didReadData デリゲート メソッドが次のように宣言されています。

/**
 * Called when a socket has completed reading the requested data into memory.
 * Not called if there is an error.
**/
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;

ソケットがデータの読み取りを完了すると、このメソッドが呼び出されることが示されています。ただし、このメソッドは何度も呼び出され、そのたびにデータ長が増加します。ダウンロードがいつ終了したかを知るにはどうすればよいですか? 最初の数バイトでデータの長さを送信するつもりですか?

4

1 に答える 1

3

そのデリゲート メソッドは、ソケットがデータの読み取りを完了すると実際に呼び出されます。方程式の欠けている部分は、受信したデータがAsyncSocket いつ完了するかを に伝えています。受信しようとしているデータを理解していないため、最後の質問でほのめかしたように、それを伝える必要があります。

これはAsyncSocket本当に輝くところです。確かに、長さのプレフィックスを付けて画像を送信し、クラスにその魔法を働かせることができます。コードは次のようになります。

[sock readDataToData:[AsyncSocket CRLFData] withTimeout:0 tag:kLengthTag];

あなたのデリゲートメソッドで:

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
    if (tag == kLengthTag) {
        NSUInteger length = /* read length out of nsdata */;
        [sock readDataToLength:length withTimeout:0 tag:kImageTag];
    } else if (tag == kImageTag) {
        /* hurray, you have your image! */
    }
}

もちろん、かなり大きな画像を転送している場合は、進行状況を追跡したい場合があります。この目的のために、-[AsyncSocket progressOfReadReturningTag:bytesDone:total:]インスタンスメソッドがあります。-[id<AsyncSocketDelegate> onSocket:didReadPartialDataOfLength:tag:]デリゲート メソッドもあります。

于 2011-04-22T00:57:23.230 に答える