iOS多个视频下载与停止下载的处理

视频下载我使用的是

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
    
    self.download = [self.urlSessionManager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
        if (progress && downloadProgress.finished) {
            progress(downloadProgress.completedUnitCount, downloadProgress.totalUnitCount);
        }
    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
        // 这里要返回一个NSURL,其实就是文件的位置路径
        NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
        // 使用建议的路径
        path = [path stringByAppendingPathComponent:response.suggestedFilename];
        NSLog(@"》》》%@",path);
        // 转化为文件路径
        return [NSURL fileURLWithPath:path];
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
        if (completion) {
            completion(filePath, error.localizedDescription);
        }
    }];
    [self.download resume];

此处self.urlSessionManager是AFURLSessionManager的对象

后台传的视频地址是一个数组,所以我用了for循环来下载,开始时暂停下载里只写了[self.download cancle],后来发现我暂停后下载任务还在执行,仔细一想是因为for循环创建了多个下载队列,我暂停的时候只是暂停了其中一个队列,后来只能在网上查资料停止当前所有下载队列的解决办法。

// 取消当前所有的网络请求
    NSMutableArray *taskData = [NSMutableArray arrayWithArray:[self.urlSessionManager downloadTasks]];
    [taskData enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if (((NSURLSessionDownloadTask *)obj).state != NSURLSessionTaskStateCompleted) {
            [(NSURLSessionDownloadTask *)obj cancel];
        }
    }];
    [taskData removeAllObjects];

后来又找到了这个方法,使用以后发现还是差点儿什么,于是我就在停止的地方加上了一个for循环并同步执行,然后停止方法起了作用。

 

关于下载进度我之前是写的

if (progress ) {  

progress(downloadProgress.completedUnitCount, downloadProgress.totalUnitCount);  

}

后来发现这个进度相加后比实际的进度大的多,然后就看了下NSProgress * _Nonnull downloadProgres这个东西,发现里边有finish属性就试了下,果然可以。

if (progress && downloadProgress.finished) {

            progress(downloadProgress.completedUnitCount, downloadProgress.totalUnitCount);

        }

18.07.10新增

以上关于进度的方法适用于视频文件较小的情况(我们的视频一个才两三M,是做的循环播放处理)。

另今天遇到了连续多次播放视频出现解码不了的问题,以下是百度到的方法

https://www.jianshu.com/p/d3566e950e91

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页