En los requisitos de video, cuando se encuentra tal requisito, al reproducir un video, es necesario descargar previamente los
siguientes 10 videos, pero solo descargar el primer millón de los siguientes diez videos.
Método de implementación
1 Establecer cacheLength al crear una solicitud
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. Al crear una solicitud, establezca el Rango del encabezado de la solicitud.
- (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;
}
Tres cómo obtener el tamaño del archivo completo.
En - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completeHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {El método proxy obtiene el rango de contenido de la respuesta campo de encabezado, tenga en cuenta que no se puede obtener a través de Content-Length, porque en este momento Content-Length es el tamaño de la parte de la solicitud que configuramos, no el tamaño completo
- (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);
}
Como se muestra abajo