サーバーから大きなファイルをダウンロードし、50個のパケットごとにチェックサムをチェックしてから、それらを一緒にステッチする既存のコードをクリーンアップしようとしています。私はそれがメモリの問題のためにしばらくの間クラッシュするように、これが最も効率的な方法であるかどうかを見るためにいくつかの問題を抱えています。私がチェックサムを持っていなければ、クラッシュするようなことはありませんが、最初にファイルをチェックできれば好きです。iOSアプリケーションで大きなファイルをダウンロードする
@property (nonatomic, retain) NSMutableData * ReceivedData;
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSData *sequencePacketData = [[NSData alloc] initWithData:self.ReceivedData];
[self ProcessPacket:sequencePacketData];
[sequencePacketData release];
[[NSNotificationCenter defaultCenter] postNotificationName:DownloadNotification object:self];
}
- (void)ProcessPacket:(NSData *)sequencePacketData {
// find the directory I need to write to and the name of the file
NSString *currentChecksum = [WebServiceManager MD5CheckSumForNSData:sequencePacketData];
BOOL checkSumValid = [dmgr ValidateChecksum:currentChecksum againstFileName:self.CurrentFileName];
self.IsSuccessful = checkSumValid;
if (!checkSumValid) {
// log error msg
return;
}
if (success)
{
NSFileHandle *handle = [NSFileHandle fileHandleForUpdatingAtPath:sequencePath];
[handle seekToEndOfFile];
[handle writeData:sequencePacketData];
[handle closeFile];
}
else
{
[sequencePacketData writeToFile:sequencePath atomically:YES];
}
// When file is completely downloaded, check the checksum of the entire file:
BOOL completeFileCheckSum;
if ([packetFile isEqualToString:@"50.bin"]) {
NSData *temData = [NSData dataWithContentsOfFile:sequencePath];
currentChecksum = [WebServiceManager MD5CheckSumForNSData:temData];
completeFileCheckSum = [dmgr ValidateChecksum:currentChecksum againstFileName:fileName];
NSLog(@"Checksum for whole file is valid: %i", completeFileCheckSum);
if (!completeFileCheckSum) {
NSError *err;
[fileManager removeItemAtPath:sequencePath error:&err];
// log error
return;
}
}
}
+ (NSString*)MD5CheckSumForNSData:(NSData *) input
{
// Create byte array of unsigned chars
unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH];
// Create 16 byte MD5 hash value, store in buffer
CC_MD5(input.bytes, input.length, md5Buffer);
// Convert unsigned char buffer to NSString of hex values
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x",md5Buffer[i]];
return output;
}
check checksum againstFileメソッドは、一時ファイルからチェックサムを取得して比較するだけです。
私はNSAutoReleasePoolsについて読んでいます。イメージの束を読み込んでメモリなどをクリアする必要がある場合はどのように役立ちますか?実際にここに当てはまるかどうかは分かりません。大きなファイル(1 GB未満)をダウンロードしてください。ありがとう!
実際には、タイプと機能が 'CC_MD5_CTX'、' 'CC_MD5_Init''、' 'CC_MD5_Update''、' 'CC_MD5_Final'であるので、' #import 'にあります。 –
NebulaFox
ヘッダーファイルはhttp://www.opensource.apple.com/source/CommonCrypto/CommonCrypto-36064/CommonCrypto/CommonDigest.h – NebulaFox
こちらをご覧ください。ありがとう! – davehayden