了解更多IOS底层原理知识,关注腾讯课堂八点钟学院IOS高级开发
IOS学习交流群 431449751;
在服务器支持的情况下才能实现该功能
断点续下功能,主要代码如下:
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; // 防止用缓冲器里面的数据
[request setValue:@"bytes=10000-"forHTTPHeaderField:@"Range"]; // 设置从哪个位置开始下载
Range头域可以请求实体的一个或者多个子范围。例如,
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)。
服务器给客服端的相应的信息查看,如下代码
- (void)connection:(NSURLConnection *)theConnection didReceiveResponse:(NSURLResponse *)response
{
NSHTTPURLResponse * httpResponse;
httpResponse = (NSHTTPURLResponse *) response;
查看httpResponse的头 allHeaderFields 能看到相关信息, 可以判断你的断点续下是否请求成功
例如("Content-Range" = "bytes 10000-196041/196042"; "Content-Length" = 186042;是下载的内容大小)// 服务器返回的字段
}
文件的读写代码:///用文件流边读边写,控制内存
self.fileStream = [NSOutputStreamoutputStreamToFileAtPath:self.filePathappend:YES]; ( append: YES 在文件尾追加数据)
如果流用 [NSOutputStream outputStreamToMemory] 这个初始化,下载一个20M的文件,需要20M的内存;而NSOutputStreamoutputStreamToFileAtPath则不需要
读文件代码:
attrs = [fileManager attributesOfItemAtPath:originalFilePath error:NULL];
originalFileSize = [[attrs objectForKey:NSFileSize] unsignedLongLongValue];
断点续传功能,主要代码如下:
CFStreamCreateBoundPair(
NULL,
((inputStreamPtr != nil) ? &readStream : NULL),
((outputStreamPtr != nil) ? &writeStream : NULL),
(CFIndex) bufferSize
);
request = [NSMutableURLRequestrequestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setHTTPBodyStream:self.inputStream];
self.connection = [NSURLConnectionconnectionWithRequest:request delegate:self];
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{caseNSStreamEventHasSpaceAvailable:
先从文件流中读取数据,然后写到outputStream中,直到写,delegate结束
bytesWritten = [self.outputStreamwrite:bufC maxLength:testStr.length];