3

私は次の問題を抱えており、数週間にわたって私を夢中にさせています。

ファイルをダウンロードするための小さなフレームワークがあります。このフレームワークには、ファイルのダウンロードを一時停止および再開する機能があります。ここまでは順調ですね。問題は、ダウンロードを一時停止するたびに、ダウンロードを再開した後、ダウンロードされたバイト数が予想されるファイルサイズと等しい場合、ダウンロードのNSURLConnection責任者が を呼び出さないが、呼び出しを続けてダウンロードが破損することです。なぜこれが必要なのかわかりません。ダウンロードを一時停止/再開しないと、すべて正常に動作します。ダウンロードを一時停止および再開するメソッドのコードを次に示します。connectionDidFinishLoadingconnectionDidReceiveData

- (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];
    }
}
4

1 に答える 1

2

予想されるファイル サイズをどのように計算しますか?

を使用する場合response.expectedContentLengthは、ダウンロードを再開するときに新しい接続を初期化するたびに、この値が減少することに注意してください。

于 2012-07-19T09:52:04.573 に答える