AFNetworking を使用して Rackspace リポジトリからファイルをダウンロードする際に問題が発生しました。
基本的に、ファイルが完全に転送されないことがありますが、AFNetworking は成功ブロックを起動します。また、受信した http 応答コードは 200 OK に設定されます。
この状況は、3G 接続でのみ発生します。WiFi では、すべてのファイルを正しく受信します。
この動作の原因について誰かヒントを教えてください。
編集、2012-05-10 問題が他の場所にある可能性があることを検出しました。ファイルの CRC をチェックして、予想される CRC と比較しています。ただし (接続が 3G 経由の場合にのみ発生します)、CRC チェックは失敗します。以下は、ファイルをダウンロードしてCRCを確認するために使用しているコードの一部です。
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlNS];
AFImageRequestOperation * imageRequestOperation = [AFImageRequestOperation imageRequestOperationWithRequest:request
imageProcessingBlock:nil
cacheName: nil
success: ^(NSURLRequest * request, NSHTTPURLResponse * response, UIImage * image)
{
[self.class postProcessDownloadAfNetworking: request andResponse: response resultImage: image error: nil];
}
failure: ^(NSURLRequest * request, NSHTTPURLResponse * response, NSError * error)
{
[self.class postProcessDownloadAfNetworking: request andResponse: response resultImage: nil error: error];
}];
imageRequestOperation.outputStream = [NSOutputStream outputStreamToFileAtPath:obj.destinationFilename append:NO];
[imageRequestOperation start];
そして、コールバック メソッドで:
if(error == nil)
{
NSData * data = [NSData dataWithContentsOfFile:imgData.destinationFilename];
uint32_t fileCrcInt = [data crc32];
NSString * fileCrcHex = [NSString stringWithFormat:@"%2X", (int) fileCrcInt] ;
NSString * fileCrcHex2 = [NSString stringWithFormat:@"000000%@", fileCrcHex] ;
fileCrcHex2 = [fileCrcHex2 substringFromIndex:[fileCrcHex2 length]-8];
// Compare CRC
if( [expectedCRC isEqualToString:fileCrcHex2] )
{
(...)
AFNetworking からの出力ストリームが完全に書き込む前に、[NSData dataWithContentsOfFile:] 命令がファイルを読み取っている可能性はありますか? ある種の iOS ディスク キャッシュなどに遭遇しているのかもしれません。