NSURLConnection クラスを使用してサーバーから非常に大きなデータをダウンロードしています。
ダウンロードを再開できるように一時停止機能を実装するにはどうすればよいですか?
NSURLConnection クラスを使用してサーバーから非常に大きなデータをダウンロードしています。
ダウンロードを再開できるように一時停止機能を実装するにはどうすればよいですか?
それ自体を一時停止することはできませんが、接続をキャンセルしてから新しい接続を作成して、古い接続が中断したところから再開することはできます。ただし、接続先のサーバーは Range ヘッダーをサポートしている必要があります。これを「bytes=size_already_downloaded-」に設定すると、キャンセルした場所からすぐに取得されます。
ダウンロードを再開して残りのファイルを取得するには、次のRange
ようにして HTTP リクエスト ヘッダーに値を設定します。
- (void)downloadFromUrl:(NSURL*)url toFilePath:(NSString *)filePath {
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
if (!request) {
NSLog(@"Error creating request");
// Do something
}
[request setHTTPMethod:@"GET"];
// Add header to existing file
NSFileManager *fm = [NSFileManager defaultManager];
if([fm fileExistsAtPath:filePath]) {
NSError *error = nil;
NSDictionary * fileProp = [fm attributesOfItemAtPath:filePath error:&error];
if (error) {
NSLog(@"Error: %@", [error localizedDescription]);
// Do something
} else {
// Set header to resume
long long fileSize = [[fileProp objectForKey:@"NSFileSize"]longLongValue];
NSString *range = @"bytes=";
range = [[range stringByAppendingString:[[NSNumber numberWithLongLong:fileSize] stringValue]] stringByAppendingString:@"-"];
[request setValue:range forHTTPHeaderField:@"Range"];
}
}
NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (!connection) {
NSLog(@"Connection failed.");
// Do something
}
}
また
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
、予想されるサイズを確認することで、既存のファイルが完全にダウンロードされているかどうかを確認するために使用できます: [response expectedContentLength];
. サイズが一致する場合は、おそらく接続をキャンセルする必要があります。