ビデオの要件では、このような要件に遭遇した場合、ビデオを再生するときに、
次の 10 個のビデオを事前にダウンロードする必要がありますが、次の 10 個のビデオの最初の 1M だけをダウンロードする必要があります。
実装方法
1 リクエスト作成時にcacheLengthを設定する
resource = [[IdiotResource alloc] init];
resource.requestURL = task.requestURL;
resource.requestOffset = task.requestOffset;
resource.fileLength = task.fileLength;
resource.cachePath = task.cachePath;
//预先下载1M
resource.cacheLength = 1024 * 1024;
resource.resourceType = IdiotResourceTypeNet;//网络资源
[self.resources addObject:resource];
2. リクエスト作成時にリクエストヘッダーの範囲を設定します
- (void)fetchFromNetwork:(IdiotResource *)task withResource:(IdiotResource *)resource{
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[resource.requestURL originalSchemeURL] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
if (resource.cacheLength > 0) {
[request addValue:[NSString stringWithFormat:@"bytes=%lld-%lld", MAX(resource.requestOffset, task.requestOffset + task.cacheLength), resource.requestOffset+resource.cacheLength-1] forHTTPHeaderField:@"Range"];
}else{
[request addValue:[NSString stringWithFormat:@"bytes=%lld-", resource.requestOffset] forHTTPHeaderField:@"Range"];
}
NSURLSessionDataTask * datatask = [self.session dataTaskWithRequest:request];
datatask.taskDescription = [NSString stringWithFormat:@"%lld",task.requestOffset];
[datatask resume];
self.currentDataTask = datatask;
}
3 完全なファイルのサイズを取得する方法
In - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask DidReceiveResponse:(NSURLResponse *)response completedHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {プロキシ メソッドは応答の Content-Range を取得します ヘッダー フィールド。現時点では、Content-Length は完全なサイズではなく、設定したリクエスト部分のサイズであるため、Content-Length を通じて取得できないことに注意してください。
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {
IdiotResource * task = [self.taskDic objectForKey:dataTask.taskDescription];
if (task.cancel) return;
if (task.fileLength <= 0) {
NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response;
NSString * contentRange = [[httpResponse allHeaderFields] objectForKey:@"Content-Range"];
NSString * fileLength = [[contentRange componentsSeparatedByString:@"/"] lastObject];
task.fileLength = fileLength.integerValue > 0 ? fileLength.integerValue : response.expectedContentLength;
}
if (self.currentResource.fileLength <= 0) {
self.currentResource.fileLength = task.fileLength;
}
if (!task.cachePath.length) {
task.cachePath = [IdiotFileManager createSliceWithUrl:task.requestURL sliceName:[NSString stringWithFormat:@"%lld-%lld",task.requestOffset,task.fileLength]];
}
if (self.currentResource.cacheLength <= 0) {
self.currentResource.cacheLength = task.fileLength - task.requestOffset;
}
completionHandler(NSURLSessionResponseAllow);
}
以下に示すように