私は次の問題を抱えており、数週間にわたって私を夢中にさせています。
ファイルをダウンロードするための小さなフレームワークがあります。このフレームワークには、ファイルのダウンロードを一時停止および再開する機能があります。ここまでは順調ですね。問題は、ダウンロードを一時停止するたびに、ダウンロードを再開した後、ダウンロードされたバイト数が予想されるファイルサイズと等しい場合、ダウンロードのNSURLConnection
責任者が を呼び出さないが、呼び出しを続けてダウンロードが破損することです。なぜこれが必要なのかわかりません。ダウンロードを一時停止/再開しないと、すべて正常に動作します。ダウンロードを一時停止および再開するメソッドのコードを次に示します。connectionDidFinishLoading
connectionDidReceiveData
- (id)pause
{
[self.connection cancel];
self.connection = nil;
return self;
}
- (id)resume
{
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:self.url cachePolicy:NSURLCacheStorageAllowed timeoutInterval:600];
NSFileManager *manager = [NSFileManager defaultManager];
NSString *localSavePath = self.savePath;
if (failBlocks.count > 0) {
[self cancel];
[self start];
}
else {
if( ![manager fileExistsAtPath:localSavePath] )
{
[manager createFileAtPath:localSavePath contents:[NSData data] attributes:nil];
}
if (self.downloadData.length > 0) {
log_muma2(@"Should resume url %@",self.url);
// Define the bytes we wish to download.
NSString *range = [NSString stringWithFormat:@"bytes=%i-", downloadData.length];
[request setValue:range forHTTPHeaderField:@"Range"];
}
if (!self.connection) {
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
self.connection = conn;
}
}
return self;
}
誰かが私を助けてくれたら本当にうれしいです。
すでにダウンロードしたデータが正しいサイズであるかどうかなど、すでにテストしました。すべて問題ないようです。
事前に感謝します。マーベリック
=========編集=========
これが私のコードですdidReceiveData
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
amountDownloaded += data.length;
NSInteger receivedLen = [data length];
bytesReceived = (bytesReceived + receivedLen);
if(expectedSize != NSURLResponseUnknownLength) {
progress = ((bytesReceived/(float)expectedSize)*100)/100;
[self performSelectorOnMainThread:@selector(updateProgressBar) withObject:nil waitUntilDone:NO];
percentComplete = progress*100;
}
if (self.savePath == nil || [self.savePath isEqualToString:@""]) {
[self.downloadData appendData:data];
}
else {
[self.downloadData appendData:data];
NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:self.savePath];
[handle seekToEndOfFile];
[handle writeData:data];
//
}
if (expectedSize < bytesReceived)
{
NSLog(@"download exceeded expected size %f with %lld", expectedSize, bytesReceived);
[self pause];
[self cancel];
self.connection = nil;
self.downloadData = nil;
bytesReceived = 0;
expectedSize = 0;
amountDownloaded = 0;
progress = 0;
percentComplete = 0;
[self start];
}
}