2012-08-29 15 views
6

私のiPadアプリで大きな.zipファイル(最大800 MB)をダウンロードする必要があります。 キャンセルされた場合や、アプリがバックグラウンドの場合は、もう一度ダウンロードを再開します。AFNetworking +大きなファイルのダウンロードを一時停止/再開

operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:YES]; 

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject){ 

// unzip the .zip 


}failure:^(AFHTTPRequestOperation *operation, NSError *error){ 

//Handle the error 

}]; 


[operation setDownloadProgressBlock:^(NSInteger bytesWritten, long long totalBytesWritten,long long totalBytesExpectedToWrite) { 

//update the progressView 

}]; 

[operation setShouldExecuteAsBackgroundTaskWithExpirationHandler:^{ 

// What I have to do here? 

}]; 

[operation start]; 
[operation waitUntilFinished]; 


-(void)applicationWillResignActive:(UIApplication *)application{ 

// What I have to do here? 

} 

ありがとうございました。

答えて

23

AFDownloadRequestOperationを使用してこれを行うことができます。

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"....zip"]]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"....zip"]; 
    AFDownloadRequestOperation *operation = [[AFDownloadRequestOperation alloc] initWithRequest:request targetPath:path shouldResume:YES]; 
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"Successfully downloaded file to %@", path); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 
    }]; 
    [operation setProgressiveDownloadProgressBlock:^(NSInteger bytesRead, long long totalBytesRead, long long totalBytesExpected, long long totalBytesReadForFile, long long totalBytesExpectedToReadForFile) { 
     NSLog(@"Operation%i: bytesRead: %d", 1, bytesRead); 
     NSLog(@"Operation%i: totalBytesRead: %lld", 1, totalBytesRead); 
     NSLog(@"Operation%i: totalBytesExpected: %lld", 1, totalBytesExpected); 
     NSLog(@"Operation%i: totalBytesReadForFile: %lld", 1, totalBytesReadForFile); 
     NSLog(@"Operation%i: totalBytesExpectedToReadForFile: %lld", 1, totalBytesExpectedToReadForFile); 
    }]; 
    [operations addObject:operation]; 

アプリを再起動して同じURLのリクエストを生成すると、ダウンロードが再開されます。 "shouldResume:YES"が機能する

+1

ARC以外の代替手段はありますか? – Tudorizer

+0

これがURLリダイレクトで機能するかどうか知っていますか?私は実際のファイルにリダイレクトしてダウンロードするためにURLを予約しました。これらのURLを使用してダウンロードが再開されないようです。 –

+0

毎回同じtargetPathを指定するようにしてください。またディレクトリにすることもできません。ディレクトリを指定すると、URLを使用してファイルに名前を付けます。 – mrgrieves

関連する問題