Code Monkey home page Code Monkey logo

tydownloadmanager's Introduction

TYDownloadManager

Download file manager wrapped NSURLSessionDataTask and NSURLSessionDownloadTask,provide progress update and status change.
下载管理类(TYDownLoadDataManager和TYDownloadSessionManager) 支持多文件断点下载和后台下载 封装了NSURLSessionDataTask和NSURLSessionDownloadTask,提供进度更新和状态改变block 和 delegate。


视频播放请看TYVideoPlayer

Requirements

  • Xcode 6 or higher
  • iOS 7.0 or higher
  • ARC

Features

  • TYDownLoadDataManager封装了NSURLSessionDataTask
  • TYDownloadSessionManager封装了NSURLSessionDownloadTask
  • 支持进度更新和状态改变block和delegate
  • 支持多文件下载和断点续传下载,TYDownloadSessionManager支持后台下载
  • 支持设置最大同时下载数maxDownloadCount和批量下载isBatchDownload
  • 支持等待下载队列 先进先出或先进后出 resumeDownloadFIFO

ScreenShot

image
image

Usage

API Quickstart

// 下载代理
@property (nonatomic,weak) id<TYDownloadDelegate> delegate;

// 下载中的模型 只读
@property (nonatomic, strong,readonly) NSMutableArray *waitingDownloadModels;

// 等待中的模型 只读
@property (nonatomic, strong,readonly) NSMutableArray *downloadingModels;

// 最大下载数
@property (nonatomic, assign) NSInteger maxDownloadCount;

// 等待下载队列 先进先出 默认YES, 当NO时,先进后出
@property (nonatomic, assign) BOOL resumeDownloadFIFO;

// 全部并发 默认NO, 当YES时,忽略maxDownloadCount
@property (nonatomic, assign) BOOL isBatchDownload;

// 单例
+ (TYDownLoadDataManager *)manager;

// 单例
+ (TYDownloadSessionManager *)manager;

// 开始下载
- (TYDownloadModel *)startDownloadURLString:(NSString *)URLString toDestinationPath:(NSString *)destinationPath progress:(TYDownloadProgressBlock)progress state:(TYDownloadStateBlock)state;

// 开始下载
- (void)startWithDownloadModel:(TYDownloadModel *)downloadModel progress:(TYDownloadProgressBlock)progress state:(TYDownloadStateBlock)state;

// 开始下载
- (void)startWithDownloadModel:(TYDownloadModel *)downloadModel;

// 恢复下载(除非确定对这个model进行了suspend,否则使用start)
- (void)resumeWithDownloadModel:(TYDownloadModel *)downloadModel;

// 暂停下载
- (void)suspendWithDownloadModel:(TYDownloadModel *)downloadModel;

// 取消下载
- (void)cancleWithDownloadModel:(TYDownloadModel *)downloadModel;

// 删除下载
- (void)deleteFileWithDownloadModel:(TYDownloadModel *)downloadModel;

// 删除下载
- (void)deleteAllFileWithDownloadDirectory:(NSString *)downloadDirectory;

// 获取正在下载模型
- (TYDownloadModel *)downLoadingModelForURLString:(NSString *)URLString;
/**
 *  下载进度
 */
@interface TYDownloadProgress : NSObject

// 续传大小
@property (nonatomic, assign, readonly) int64_t resumeBytesWritten;
// 这次写入的数量
@property (nonatomic, assign, readonly) int64_t bytesWritten;
// 已下载的数量
@property (nonatomic, assign, readonly) int64_t totalBytesWritten;
// 文件的总大小
@property (nonatomic, assign, readonly) int64_t totalBytesExpectedToWrite;
// 下载进度
@property (nonatomic, assign, readonly) float progress;
// 下载速度
@property (nonatomic, assign, readonly) float speed;
// 下载剩余时间
@property (nonatomic, assign, readonly) int remainingTime;

@end

Block

// TYDownloadModel block
// 进度更新block
typedef void (^TYDownloadProgressBlock)(TYDownloadProgress *progress);
// 状态更新block
typedef void (^TYDownloadStateBlock)(TYDownloadState state,NSString *filePath, NSError *error);

Delegate

// TYDownLoadDataManager 和 TYDownloadSessionManager
// TYDownLoadManager下载代理
@protocol TYDownloadDelegate <NSObject>

// 更新下载进度
- (void)downloadModel:(TYDownloadModel *)downloadModel didUpdateProgress:(TYDownloadProgress *)progress;
// 更新下载状态
- (void)downloadModel:(TYDownloadModel *)downloadModel didChangeState:(TYDownloadState)state filePath:(NSString *)filePath error:(NSError *)error;

@end

Demo

// 下载可以使用 manager的代理 或者 downloadModel的block

- (IBAction)download:(id)sender {
    TYDownloadSessionManager *manager = [TYDownloadSessionManager manager];
    
    if (_downloadModel.state == TYDownloadStateReadying) {
        [manager cancleWithDownloadModel:_downloadModel];
        return;
    }
    
    if ([manager isDownloadCompletedWithDownloadModel:_downloadModel]) {
        [manager deleteFileWithDownloadModel:_downloadModel];
    }
    
    if (_downloadModel.state == TYDownloadStateRunning) {
        [manager suspendWithDownloadModel:_downloadModel];
        return;
    }
    [self startDownlaod];
}

- (void)startDownlaod
{
    TYDownloadSessionManager *manager = [TYDownloadSessionManager manager];
    __weak typeof(self) weakSelf = self;
    [manager startWithDownloadModel:_downloadModel progress:^(TYDownloadProgress *progress) {
        weakSelf.progressView.progress = progress.progress;
        weakSelf.progressLabel.text = [weakSelf detailTextForDownloadProgress:progress];
        
    } state:^(TYDownloadState state, NSString *filePath, NSError *error) {
        if (state == TYDownloadStateCompleted) {
            weakSelf.progressView.progress = 1.0;
            weakSelf.progressLabel.text = [NSString stringWithFormat:@"progress %.2f",weakSelf.progressView.progress];
        }
        
        [weakSelf.downloadBtn setTitle:[weakSelf stateTitleWithState:state] forState:UIControlStateNormal];
        
        //NSLog(@"state %ld error%@ filePath%@",state,error,filePath);
    }];
}

// [TYDownloadSessionManager manager].delegate = self;
// [TYDownLoadDataManager manager].delegate = self;

#pragma mark - TYDownloadDelegate

- (void)downloadModel:(TYDownloadModel *)downloadModel didUpdateProgress:(TYDownloadProgress *)progress
{
     NSLog(@"delegate progress %.3f",progress.progress);
}

- (void)downloadModel:(TYDownloadModel *)downloadModel didChangeState:(TYDownloadState)state filePath:(NSString *)filePath error:(NSError *)error
{
    NSLog(@"delegate state %ld error%@ filePath%@",state,error,filePath);
}

Contact

如果你发现bug,please pull reqeust me
如果你有更好的改进,please pull reqeust me

tydownloadmanager's People

Contributors

12207480 avatar coderweil avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tydownloadmanager's Issues

【bug】缓存目录不一致

你好,我在TYDownloadDataManager中看到缓存文件目录后缀是“TYDownloadDataCache”,而TYDownloadModel中缓存文件后缀是“TYDownloadCache”,所以删除一个文件没有问题,全部删除则不会生效。

未完成任务

可否提供一个未下载完成的TYDownloadModel数组列表的方法?

建议:缓存文件形式下载。

建议:未完成的或下载进行中的,暂时以下载缓存文件形式保存。譬如xxxx.png.dl 这种形式。
下载完成自动处理成xxxx.png。自定义的保存路径不变。

崩溃问题

2016-10-24 8 39 21

你好!我现在在项目里用了您的下载类,不过最近发现 时有崩溃,最开始以为是我自己的问题,就一直想着解决。每次崩溃后都大概是这样的信息。

libBacktraceRecording.dylib`__gcd_queue_item_enqueue_hook_block_invoke:
0x101538ea8 <+0>: pushq %rbp
0x101538ea9 <+1>: movq %rsp, %rbp
-> 0x101538eac <+4>: movq 0x20(%rsi), %rax
0x101538eb0 <+8>: movq 0x20(%rdi), %rcx
0x101538eb4 <+12>: cmpq 0x8(%rcx), %rax
0x101538eb8 <+16>: sete %al
0x101538ebb <+19>: popq %rbp
0x101538ebc <+20>: retq

我除了CPU使用率过高外实在是找不出别原因 就用您原有的demo试验,确实不怎么崩溃,而后我将您的任务数量改成2([TYDownLoadDataManager manager].maxDownloadCount = 2;)这时就我的程序一样 时长崩溃,报的错相同。

libBacktraceRecording.dylib`__gcd_queue_item_enqueue_hook_block_invoke:
0x10631fea8 <+0>: pushq %rbp
0x10631fea9 <+1>: movq %rsp, %rbp
-> 0x10631feac <+4>: movq 0x20(%rsi), %rax
0x10631feb0 <+8>: movq 0x20(%rdi), %rcx
0x10631feb4 <+12>: cmpq 0x8(%rcx), %rax
0x10631feb8 <+16>: sete %al
0x10631febb <+19>: popq %rbp
0x10631febc <+20>: retq

com.apple.NSURLConnectionLoader(8):EXC_BAD_ACCESS (code=EXC_i386_GPFLT)

用你的程序跑 也是CPU 利用率过100% 我己经截了一张图, 在第一行(cpu 已 170%)。如果不能查看图片 请回复我 我在给您发邮件。 希望您能解决问题,帮小弟一把,即使不好解决也请告知我一声。
在9月份的时候,我提过崩溃的问题,不过我还以为是iOS10 Xcode8导致的 看见您提交了更新 就没有在询问,不过这次因为我们老大要我展示这阶段工作,没能力自己解决 所以来向您寻求帮助。

TYDownloadSessionManager怎么增加最大下载数

大神,你好,我想问个问题,TYDownloadSessionManager怎么增加最大下载数,我把maxDownloadCount设置成20,可是还是只能同时下载三个,开第四个下载下载任务存在,但是就是不下载,只有前面三个有一个下载完成,第四个下载任务才会开始,求解答

崩溃问题

您好,这边使用您的下载库有在下载过程中有较低的概率崩溃,截图如下:

2016-11-14 10 41 23

你好 有一个 小问题

// 下载中的模型 只读
@Property (nonatomic, strong,readonly) NSMutableArray *waitingDownloadModels;

// 等待中的模型 只读
@Property (nonatomic, strong,readonly) NSMutableArray *downloadingModels;

你的命名 和 注释 不知道是不是写反了。。

复用问题求解

RT.
请问如何可以动态创建,复用下载的方法,我看您的管理类中没有对 model 做标识,多任务的话,如何找到对应的队列关系;
我现在多任务不暂停的情况下是正常的,但是暂停在继续,就会出错

能写一个 多线程下载的Demo吗

从添加下载到下载中的(未下载完成的,下载中的),下载管理中有 下载中/下载完成。
本来想自己写一个,发现plist中只有 下载地址,以及已下载的大小,没有做数据库持久化

TYDownloadSessionManager怎么获取本地的下载进度

TYDownloadSessionManager怎么获取本地的下载进度,我看在TYDownLoadDataManager有- (TYDownloadProgress *)progessWithDownloadModel:(TYDownloadModel *)downloadModel;方法,但是TYDownloadSessionManager中没有,请问怎么能获取呢?

关于下载地址获取的优化建议

大神你好,我在使用TY这个库的时候,遇到了一个下载问题,现在下载地址是_fileName = _downloadURL.lastPathComponent;我在实际中遇到了一个情况是,如果url的lastPathComponent是规范的,截取出来是没有问题的,但是我们的地址出现了一些特殊字符的情况,下载下来后导致的结果是本地url可以获取到,但是在查找的时候找不到对应地址所在的视频,经过排查后发现是文件名称格式规范的问题,可能名称中带有了一些特殊符号,导致查询失败,这里我用下面的方法解决了,

if ([_downloadURL.lastPathComponent containsString:@"?"]) {
            NSArray *array = [_downloadURL.lastPathComponent componentsSeparatedByString:@"?"];
            _fileName = array.firstObject;
        }else {
            _fileName = _downloadURL.lastPathComponent;
        }

在设置_fileName的时候这样获取文件名,就可以避免格式问题

iOS 11 下载问题

iOS 11 下 TYDownloadSessionManager 连续多次点击下载/暂停,会导致下载错误,进度跳跃,下载的文件用不了。

TYDownLoadDataManager 下载进度问题

不知道是下载的文件格式问题,还是下载地址问题。
下载地址改成demo里写死的地址,暂停下载后继续,进度获取是正常的。
如果用自己的地址,暂停下载后,进度获取不正常。

您好 小白请教几个问题

我的页面上有一个下载视频的按钮 点击下载视频以后 要到个人中心的-> 我的缓存界面查看 怎么才能实时更新这些数据 TYDownloadManager只提供了这两个属性来实时观察。 怎么才能把暂停的数据 和已完成的数据 同时显示出来 并且不会丢失 谢谢您。
@Property (nonatomic, strong) NSMutableArray *waitingDownloadModels;
// 等待中的模型
@Property (nonatomic, strong) NSMutableArray *downloadingModels;

Pull Request #48 中问题的简单解法

Pull Request #48 中提到的问题,以下是一个更简单解法

// TYDownloadModel.m 

- (instancetype)initWithURLString:(NSString *)URLString
                         filePath:(NSString *)filePath {
    if (self = [self init]) {
        _downloadURL = URLString;
        
        // to fix url 中有 query 参数,导致取到的 file name 为 xxx.mp3?xxxx 的问题
        _fileName = [NSURL URLWithString:URLString].lastPathComponent;

        _downloadDirectory = filePath.stringByDeletingLastPathComponent;
        _filePath = filePath;
    }
    return self;
}

文件名相同时下载有bug

// 创建流
downloadModel.stream = [NSOutputStream outputStreamToFileAtPath:downloadModel.filePath append:YES];

downloadURL 不同但文件名相同时 downloadModel.filePath相同 明显有bug

作者你好

Invalid resume data for background download. Background downloads must use http or https and must download to an accessible file. 出现这个问题是IOS 8以上由于临时路径改变,导致resume data临时路径不可用,可以改变resume data里面的临时路径来解决恢复下载出错的问题。

同时下载多个总会闪退~~~ 复现频率蛮高的 ios9系统环境,不确定其他环境。

2016-09-07 13:45:16.115 EdujiaAppd[13902:2313195] Bugly: Trapped uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter'
(
0 CoreFoundation 0x000000010f3cfd85 exceptionPreprocess + 165
1 libobjc.A.dylib 0x00000001139bcdeb objc_exception_throw + 48
2 CoreFoundation 0x000000010f3cfcbd +[NSException raise:format:] + 205
3 Foundation 0x0000000110146157 -[NSURL(NSURL) initFileURLWithPath:] + 131
4 Foundation 0x00000001101460bf +[NSURL(NSURL) fileURLWithPath:] + 45
5 EdujiaAppd 0x000000010ce71ccb -[TYDownloadSessionManager moveFileAtURL:toPath:] + 539
6 EdujiaAppd 0x000000010ce72afd -[TYDownloadSessionManager URLSession:downloadTask:didFinishDownloadingToURL:] + 637
7 CFNetwork 0x000000010ef08cca __82-[NSURLSession delegate_downloadTask:didFinishDownloadingToURL:completionHandler:]_block_invoke + 38
8 Foundation 0x0000000110212630 __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK
+ 7
9 Foundation 0x000000011014d805 -[NSBlockOperation main] + 101
10 Foundation 0x0000000110130725 -[__NSOperationInternal _start:] + 646
11 Foundation 0x0000000110130336 __NSOQSchedule_f + 194
12 libdispatch.dylib 0x0000000114b443eb _dispatch_client_callout + 8
13 libdispatch.dylib 0x0000000114b2a82c _dispatch_queue_drain + 2215
14 libdispatch.dylib 0x0000000114b29d4d _dispatch_queue_invoke + 601
15 libdispatch.dylib 0x0000000114b2c996 _dispatch_root_queue_drain + 1420
16 libdispatch.dylib 0x0000000114b2c405 _dispatch_worker_thread3 + 111
17 libsystem_pthread.dylib 0x0000000114e814de _pthread_wqthread + 1129
18 libsystem_pthread.dylib 0x0000000114e7f341 start_wqthread + 13
)

本地缓存的方式下载

博主 能用TYDownloadSessionManager做 边下载边缓存本地文件的方式做下载吗 急 在线等 希望能单独交流 QQ1015857193

TYDownloadSessionManager后台下载问题

用TYDownloadSessionManager可以禁用后台下载吗?我在AppDelegate中没有设置后台下载设置,结果还是能进行后台下载,这个问题能帮忙解决下吗?

怎么一键开始、暂停,删除全部的下载任务

作者你好,你这里只是封装了等待和下载中的两个数组,这边我想批量删除所有的下载任务是不是还要自己写方法,最好是你能封装一套开启暂停移除所有下载任务的方法

崩溃问题

libBacktraceRecording.dylib`__gcd_queue_item_enqueue_hook_block_invoke:
0x10cd9eea8 <+0>: pushq %rbp
0x10cd9eea9 <+1>: movq %rsp, %rbp
-> 0x10cd9eeac <+4>: movq 0x20(%rsi), %rax
0x10cd9eeb0 <+8>: movq 0x20(%rdi), %rcx
0x10cd9eeb4 <+12>: cmpq 0x8(%rcx), %rax
0x10cd9eeb8 <+16>: sete %al
0x10cd9eebb <+19>: popq %rbp
0x10cd9eebc <+20>: retq

xcode 8 iOS 10模拟器 偶尔崩溃

URL失效问题

您好,我碰到一个问题是 :下载的时候crash了,再次打开app的时候,下载的URL失效了(url时效是两小时),这个时候我获取不到resumeData 方法如下 :
// 获取resumeData

  • (NSData *)resumeDataFromFileWithDownloadModel:(DWDownloadModel *)downloadModel
    {
    if (downloadModel.resumeData) {
    return downloadModel.resumeData;
    }
    NSString *resumeDataPath = [self resumeDataPathWithDownloadURL:downloadModel.downloadURL];

    if ([_fileManager fileExistsAtPath:resumeDataPath]) {
    NSData *resumeData = [NSData dataWithContentsOfFile:resumeDataPath];
    return resumeData;
    }
    return nil;

}

请问我该怎么操作呢 求教

关于下载占用内存的问题

亲测了一种情况,刚进入app(模拟器)的时候是100M,下载一个120分钟的大视频文件,在下载的过程中内存不断升高,等到下载完成,内存达到了430多M,我在中间没有做其他操作,也就是说下载的过程中消耗了很大的内存,这一块怎么优化呢?

几个问题

我测试的时候发现了些问题,表示很不解:
1、APP在下载过程中突然崩溃了,如何去保存completionHandler()?

2、在- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)(void))completionHandler 中,好像并不需要创建参照? 我发现没创建也是OK的,不知道和创建了有什么区别

3、如果我创建了多个NSURLSession,到后台后是不是要保存多份completionHandler()?

4、我重新进入APP的时候,创建NSURLSession就自动给我继续下载了,导致我在逻辑处理出了问题,怎么让它不自动下载?

TYDownLoadDataManager

使用TYDownLoadDataManager,发现真机的时候,后台不下载 ,这个问题博主能改下吗?支持后台下载,如果改了这些问题 ,这个库就更刁了,博主很棒的

如何记录下载状态

你好作者,请教一个问题,一个下载中的视频,这时候在后台退掉程序,再进程序,视频的状态就没了,怎么能记录状态呢?在线等,急!

TYDownloadSessionManager

你好,博主,关于TYDownloadSessionManager的for循环下载,第一次点击是正常下载的,在他们下载的时候再次点击,就不下载了,请问一下这是什么原因,谢谢

License问题

作者您好,我们在用您的这个源码,由于一些公司政策的要求,麻烦您能否加上一个License文件,诸如MIT之类的?谢谢!

如何获取已暂停的model

如题 请大神予以帮助
因为需求要求下载暂停后退出app 下次进来时需要获取这些状态和进度

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.