特に「大きな」ファイル(5〜10 mb)で、しばらくGCDAsyncSocket(MRC / iOS5.1)で遊んでいます。残念ながら、ストリームの最後に数バイトあるだけで、読み取りストリームが完了しないことがあります (スタックするなど)。はdidReadPartialDataOfLength:
私に情報を提供するのをやめ、didReadData
はまったく解雇されません。
これが私のコードの一部です(書き込み/読み取りの両方の例で、ホストとクライアント間の接続が確立されています)
書き込み
#define kHeadTag 0
#define kDataTag 1
typedef struct {
NSUInteger size;
} head_t;
-(void)sendData:(NSData *)__data {
_sendData = [__data retain];
head_t header;
header.size = __data.length;
[_socket writeData:[NSData dataWithBytes:&header
length:sizeof(header)]
withTimeout:-1
tag:kHeadTag];
}
-(void)socket:(GCDAsyncSocket *)sock
didWriteDataWithTag:(long)tag {
if (tag == kHeadTag) {
[sock writeData:_sendData withTimeout:-1 tag:kDataTag];
[_sendData release];
_sendData = nil;
}
}
読む
-(void)socket:(GCDAsyncSocket *)sock
didReadData:(NSData *)data
withTag:(long)tag {
switch (tag) {
// ------------------------------------- HEAD
case kHeadTag:{
head_t head;
[data getBytes:&head length:sizeof(head)];
_readHead = head;
NSLog(@"Received header (total size = %i bytes)", head.size);
[sock readDataToLength:head.size
withTimeout:-1
tag:kDataTag];
}
break;
// ------------------------------------- BODY
case kDataTag: {
NSLog(@"Data received with %i bytes", data.length);
[sock readDataToLength:sizeof(head_t) withTimeout:-1 tag:kHeadTag];
}
break;
}
};
-(void)socket:(GCDAsyncSocket *)sock
didReadPartialDataOfLength:(NSUInteger)partialLength
tag:(long)tag {
if (tag == kDataTag) {
NSLog(@"Data read with %i bytes", partialLength);
}
};
これが私が間違っていることを確認するのに十分なコードであることを願っています。または、これが大量のデータの書き込み/読み取りの悪い習慣である可能性があります。