- 小文件(数据全部保存到内存中,无法显示进度):
- 直接通过NSData的方法下载
- 通过NSURLSessionDataTask-block下载
通过NSConnection-block发送请求(过期不用)
-
大文件断点下载(实现功能:内存控制、进度显示、暂停与取消后继续下载):
- 通过NSURLSessionDownloadTask-delegate下载
- 注意暂停与取消resume,继续下载的地方是不同的,要做判断设置
通过NSConnection-delegate下载(过期不用)
- 通过NSURLSessionDownloadTask-delegate下载
-
大文件离线断点下载(实现功能:内存控制、进度显示、暂停与取消后继续下载、程序重新打开显示已经下载的进度与继续下载):
- 通过NSURLSessionDataTask-delegate下载
- NSURLSessionDownloadTask提供了断点下载的方法,但该方法无法实现离线下载功能,只能通过NSURLSessionDataTask实现;
通过NSConnection-delegate下载(过期不用)
- 通过NSURLSessionDataTask-delegate下载
文件下载使用推荐:
简单(小文件下载):通过NSData下载或者NSURLSessionDataTask-block下载
进阶(大文件断点下载):通过NSURLSessionDownloadTask下载
高级(离线断点下载):通过NSURLSessionDataTask下载
#### 使用多线程下载文件思路(仅适用于NSURLConnection,NSURLSession已经自动实现多线程)(过期)
01 开启多条线程,每条线程都只下载文件的一部分(通过设置请求头中的Range来实现)
02 创建一个和需要下载文件大小一致的文件,判断当前是那个线程,根据当前的线程来判断下载的数据应该写入到文件中的哪个位置。(假设开5条线程来下载10M的文件,那么线程1下载0-2M,线程2下载2-4M一次类推,当接收到服务器返回的数据之后应该先判断当前线程是哪个线程,假如当前线程是线程2,那么在写数据的时候就从文件的2M位置开始写入)
03 代码相关:使用NSFileHandle这个类的seekToFileOfSet方法,来向文件中特定的位置写入数据。
04 技术相关
a.每个线程通过设置请求头下载文件中的某一个部分
b.通过NSFileHandle向文件中的指定位置写数据