comefrom:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73d6f8b9042238fce0984642c101a39fefd60644d44889622261cf31e1aafad762b2a0322b49bd58b49debe8f2e248230340746c01e4cc75cf28b102a9e79cc0dafea44a7e3e733e3f78995c85422910e446d80819c2a7303be6ee76540f4d5935f142f07ca9c27148e4e012b88574aa14689f7431a10f0f6ca2a4ad45cda&p=8d7fc54ad5c34bf70be2962c444188&newp=9a769a4786cc42af52ad886d15088e231610db2151d6da&user=baidu&fm=sc&query=mknetworkkit+ios+%BA%F3%CC%A8%BC%CC%D0%F8%CF%C2%D4%D8&qid=c53ebf38000a5837&p1=1

https://github.com/MugunthKumar/MKNetworkKit

使用MKNetworkKit

  1. 首先把clone下来的MKNetworkKit文件夹拖进你的项目里面
  2. 到项目里面增加CFNetwork.Framework SystemConfiguration.framework 和 Security.framework.
  3. 把MKNetworkKit.h包含到你的pch文件里面。
  4. 如果是 如果是Mac,删除UIAlertView+MKNetworkKitAdditions.h这个文件

这样,再看看介绍里面的例子。应该就能看懂普通用法了。然后畅快的使用MKNetworkKit库了。

改写目标

上次写的ASIHTTPRequest续传其实已经可以用了。但是为什么需要重新写呢。就是重用!!!

一直都很少自己设计接口什么的。其实只是做了写体力的劳动,把一堆逻辑换成代码给堆了起来。觉得没有人会去重用自己的代码。很少去花心思想怎么样才能写好。

这次改写就只有一个目标,为了更好更多人能使用断点续传来 功能

下载应该在下载继续进行。

保持进度条

每次进入 暂停恢复 可以随时暂停下载

这次改写,这些功能都实现了,啊哈哈哈。

实现

MKNetworkKit库修改

最开始使用MKNetworkKit库做

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

  NSUInteger size = [self.response expectedContentLength] < 0 ? 0 : [self.response expectedContentLength];
self.response = (NSHTTPURLResponse*) response; // dont' save data if the operation was created to download directly to a stream.
if([self.downloadStreams count] == 0)
self.mutableData = [NSMutableData dataWithCapacity:size];
else
self.mutableData = nil; for(NSOutputStream *stream in self.downloadStreams)
[stream open]; NSDictionary *httpHeaders = [self.response allHeaderFields]; // if you attach a stream to the operation, MKNetworkKit will not cache the response.
// Streams are usually "big data chunks" that doesn't need caching anyways. if([self.request.HTTPMethod isEqualToString:@"GET"] && [self.downloadStreams count] == 0) { // We have all this complicated cache handling since NSURLRequestReloadRevalidatingCacheData is not implemented
// do cache processing only if the request is a "GET" method
NSString *lastModified = [httpHeaders objectForKey:@"Last-Modified"];
NSString *eTag = [httpHeaders objectForKey:@"ETag"];
NSString *expiresOn = [httpHeaders objectForKey:@"Expires"]; NSString *contentType = [httpHeaders objectForKey:@"Content-Type"];
// if contentType is image, NSDate *expiresOnDate = nil; if([contentType rangeOfString:@"image"].location != NSNotFound) { // For images let's assume a expiry date of 7 days if there is no eTag or Last Modified.
if(!eTag && !lastModified)
expiresOnDate = [[NSDate date] dateByAddingTimeInterval:kMKNetworkKitDefaultImageCacheDuration];
else
expiresOnDate = [[NSDate date] dateByAddingTimeInterval:kMKNetworkKitDefaultImageHeadRequestDuration];
} NSString *cacheControl = [httpHeaders objectForKey:@"Cache-Control"]; // max-age, must-revalidate, no-cache
NSArray *cacheControlEntities = [cacheControl componentsSeparatedByString:@","]; for(NSString *substring in cacheControlEntities) { if([substring rangeOfString:@"max-age"].location != NSNotFound) { // do some processing to calculate expiresOn
NSString *maxAge = nil;
NSArray *array = [substring componentsSeparatedByString:@"="];
if([array count] > 1)
maxAge = [array objectAtIndex:1]; expiresOnDate = [[NSDate date] dateByAddingTimeInterval:[maxAge intValue]];
}
if([substring rangeOfString:@"no-cache"].location != NSNotFound) { // Don't cache this request
expiresOnDate = [[NSDate date] dateByAddingTimeInterval:kMKNetworkKitDefaultCacheDuration];
}
} // if there was a cacheControl entity, we would have a expiresOnDate that is not nil.
// "Cache-Control" headers take precedence over "Expires" headers expiresOn = [expiresOnDate rfc1123String]; // now remember lastModified, eTag and expires for this request in cache
if(expiresOn)
[self.cacheHeaders setObject:expiresOn forKey:@"Expires"];
if(lastModified)
[self.cacheHeaders setObject:lastModified forKey:@"Last-Modified"];
if(eTag)
[self.cacheHeaders setObject:eTag forKey:@"ETag"];
} if ([self.mutableData length] == 0 || [self.downloadStreams count] > 0) {
// This is the first batch of data
// Check for a range header and make changes as neccesary
NSString *rangeString = [[self request] valueForHTTPHeaderField:@"Range"];
if ([rangeString hasPrefix:@"bytes="] && [rangeString hasSuffix:@"-"]) {
NSString *bytesText = [rangeString substringWithRange:NSMakeRange(6, [rangeString length] - 7)];
self.startPosition = [bytesText integerValue];
self.downloadedDataSize = self.startPosition;
DLog(@"Resuming at %d bytes", self.startPosition);
}
}
} - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { if([self.downloadStreams count] == 0)
[self.mutableData appendData:data]; for(NSOutputStream *stream in self.downloadStreams) { if ([stream hasSpaceAvailable]) {
const uint8_t *dataBuffer = [data bytes];
[stream write:&dataBuffer[0] maxLength:[data length]];
}
} self.downloadedDataSize += [data length]; for(MKNKProgressBlock downloadProgressBlock in self.downloadProgressChangedHandlers) { if([self.response expectedContentLength] > 0) { double progress = (double)(self.downloadedDataSize) / (double)(self.startPosition + [self.response expectedContentLength]);
downloadProgressBlock(progress);
}
}
}

具体改了哪,忘记了。有心思对照源码看看。应该是属于MKNetworkKit的bug。也不知道新版改过来没有。但是你clone我的demo,这个版本是可以的。

断点 其实我一共就写了两个简单的类而已。

基础的是SIBreakpointsDownload。继承于MKNetworkOperation。判断了续传的位置。

一个SIDownloadManager写成单例,继承于MKNetworkEngine。用来管理多任务 使用的时候就只用SIDownloadManager这个类来添加下载。然后想在 demo地址

git@github.com:iiiyu/SIDownloader.git

其实已经很简单了,照着demo改改就能自己用了。

总结

这次改写以后,代码结构变的很清晰。复杂性和耦合性都有所降低。可用性提高。而且,反正我是没有google到可以直接拿来用的断点ios代码库-www.lanrenios.com

MKNetworkKit的断点续传SIDownloader下载的更多相关文章

  1. python多进程断点续传分片下载器

    python多进程断点续传分片下载器 标签:python 下载器 多进程 因为爬虫要用到下载器,但是直接用urllib下载很慢,所以找了很久终于找到一个让我欣喜的下载器.他能够断点续传分片下载,极大提 ...

  2. Android的断点续传的下载在线文件示例

    Android的断点续传的下载在线文件示例 文件的结构如下: activity_main.xml: <LinearLayout xmlns:android="http://schema ...

  3. C#: 实现支持断点续传多线程下载

    /* .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)* Reflector 了一下 System.Net.WebClien ...

  4. http文件的断点续传和下载

    http://www.tuicool.com/articles/ZbyymqJ Content-Disposition:inline; filename= "c501b_01_h264_sd ...

  5. Java-->实现断点续传(下载)

    --> 断点续传: 就像迅雷下载文件一样,停止下载或关闭程序,下次下载时是从上次下载的地方开始继续进行,而不是重头开始... --> RandomAccessFile --> poi ...

  6. asp.net断点续传技术---下载(转)

    断点续传的原理 在了解HTTP断点续传的原理之前,先来说说HTTP协议,HTTP协议是一种基于tcp的简单协议,分为请求和回复两种.请求协议是由客户机(浏览器)向服务器(WEB SERVER)提交请求 ...

  7. java实现文件的断点续传的下载

    java的断点续传是基于之前java文件下载基础上的功能拓展 首先设置一个以线程ID为名的下载进度文件, 每一次下载的进度会保存在这个文件中,下一次下载的时候,会根据进度文件里面的内容来判断下载的进度 ...

  8. Android 多线程断点续传同时下载多个大文件

    最近学习在Android环境中一些网络请求方面的知识,其中有一部分是关于网络下载方面的知识.在这里解析一下自己写的demo,总结一下自己所学的知识.下图为demo的效果图,仿照一些应用下载商城在Lis ...

  9. 用java实现文件的断点续传并发下载

    需求: 支持文件批量下载.现在有很多小图片需要批量下载,不希望在服务器打包下载. 支持大文件断点下载.比如下载10G的文件. PC端全平台支持.Windows,macOS,Linux 全浏览器支持.i ...

随机推荐

  1. 1.一个WEB应用的开发流程

    先说项目开发过程中团队人员的分工协作. 一.人员安排 毕业至今的大部分项目都是独立完成,虽然也有和其他同事协作的时候,但自认为对团队协作的了解和认知都还有所欠缺.很清楚团队协作的重要性,但尚未有很好的 ...

  2. 调色板原理 & 编程

    调色板原理 & 编程 逻辑调色板结构LOGPALETTE,该结构定义如下: typedef struct tagLOGPALETTE { WORD palVersion; //调色板的板本号, ...

  3. ECMall 25个 数据库表 说明文档

    ecm_acategory //文章分类表 字段 类型 Null 默认 注释 cate_id int(10) 否   自增ID号,分类ID号 cate_name varchar(100) 否   分类 ...

  4. 深度学习利器: TensorFlow系统架构及高性能程序设计

    2015年11月9日谷歌开源了人工智能平台TensorFlow,同时成为2015年最受关注的开源项目之一.经历了从v0.1到v0.12的12个版本迭代后,谷歌于2017年2月15日发布了TensorF ...

  5. Linear to physical address translation with support for page attributes

    Embodiments of the invention are generally directed to systems, methods, and apparatuses for linear ...

  6. Yii 错误页面处理

    [错误页面处理] 訪问一个错误的控制器 訪问一个错误的方法 有些控制器和方法禁止訪问   以上訪问会提示错误信息 404  403 以上错误信息是不方便给外边用户看到的. 1. 安全隐患 2. 用户体 ...

  7. stm32优先级

  8. VC/MFC中为程序定义全局快捷键

    VC 2010-05-01 18:01:34 阅读287 评论0 字号:大中小 订阅 1.注册快捷键 在初始化函数,如OnInitDialog() 注册快捷键,代码如下: #define HotKey ...

  9. PL/SQL精明的调用栈分析

    PL/SQL精明的调用栈分析 原文:http://www.oracle.com/technetwork/issue-archive/2014/14-jan/o14plsql-2045346.html ...

  10. sublime课程3 sublime编辑器的常用设置有哪些

    sublime课程3 sublime编辑器的常用设置有哪些 一.总结 一句话总结:其实功能的话可以直接取配置里面搜索关键词,所以搜索是神技. 1.sublime如何开启背景线? "highl ...