The main point is to pay attention to the customer service to the server when the request, in the request header is able to set the server to return the data from where to end.
When the server responds to the client, it can get the exact type and size of the data returned by the server.
#import <Foundation/Foundation.h> @interface The remote URL (the path of the connection server) that the zyfiledownload:nsobject//needs to download @property ( Nonatomic, Strong) nsstring *urlstr;//file storage path @property (nonatomic, strong) NSString *goalpath;//Whether you are downloading @property ( Nonatomic, ReadOnly, getter= isdownloading) BOOL downloading;//monitoring Download Progress @property (nonatomic, copy) void (^progresshandler ) (double progress);//Callback @property (nonatomic, copy) void (^finishhandler) After download is completed,//callback @property after download failed (nonatomic, copy void (^failurehandler) (Nserror *error);//Start download-(void) start;//pause download-(void) pause; @end/* file is generally saved at the address below, Documents in the path of the file needs to be synchronized, the file consumption performance, the TMP path will be deleted at any time so generally saved in the library\caches path to obtain this path: nsstring *caches = [Nssearchpathfordi Rectoriesindomains (Nscachesdirectory, Nsuserdomainmask, YES) lastobject]; NSString *filepath = [caches stringbyappendingpathcomponent:@ "filename. suffix name"]; */#import "ZYFileDownLoad.h" @interface zyfiledownload () <nsurlconnectiondatadelegate>//the currently downloaded data length @property ( Nonatomic, assign) long long currentlength;//Connection Object @Property (Nonatomic, Strong) nsurlconnection *connection;//total file length @property (nonatomic, assign) long long totallength;// Write file handle @property (Nonatomic, strong) Nsfilehandle *writehandle; @end @implementation zyfiledownload-(void) start{[ Self.urlstr stringbyaddingpercentescapesusingencoding:nsutf8stringencoding]; Nsurl *url = [Nsurl URLWithString:self.urlStr]; Nsmutableurlrequest *request = [[Nsmutableurlrequest alloc] initwithurl:url]; Set the request header information, this indicates that this data range is currentprogress to the end of the file (that is, only set the beginning from where to download) nsstring *value = [NSString stringwithformat:@ "bytes=% Lld-", Self.currentlength]; [Request Setvalue:value forhttpheaderfield:@ "Range"]; Self.connection = [nsurlconnection connectionwithrequest:request delegate:self]; _downloading = YES;} -(void) pause{[self.connection Cancel]; Self.connection = nil; _downloading = NO;} #pragma mark----nsurlconnectiondatadelegate//call-(void) connection: (Nsurlconnection *) connection when the request error (failed) Didfailwitherror: (Nserror *) Error{if (self.failurehandler) {Self.failurehandler (error); }}-(void) connection: (Nsurlconnection *) connection didreceiveresponse: (Nsurlresponse *) response{if ( Self.totallength) return; When the response has been answered, there is no need to reply again (mainly to pause the download, and then reply to the download operation)//create an empty file into the sandbox nsfilemanager *manager = [Nsfilemanager Defaultmanager]; [Manager CreateFileAtPath:self.goalPath Contents:nil Attributes:nil]; Create file handle to write Data Self.writehandle = [Nsfilehandle FileHandleForWritingAtPath:self.goalPath]; Gets the length of the full file (when the server responds to the client, the specific file length is returned) Self.totallength = Response.expectedcontentlength;} When the data received to the server is called (may be called multiple times, each call will only pass part of the data)-(void) connection: (Nsurlconnection *) connection didreceivedata: (NSData *) data{Self.currentlength + = [data length]; Download complete, Cumulative length//progress double progress = (double) self.currentlength/self.totallength; The block callback allows you to execute the operation if (Self.progresshandler) {Self.progresshandler (progress) inside the block; }//Move end of file, append data to tail [Self.writehanDle Seektoendoffile]; [Self.writehandle Writedata:data];} -(void) connectiondidfinishloading: (nsurlconnection *) connection{//Download complete, please attribute self.currentlength = 0; self.totallength = 0; if (self.currentlength = = self.totallength) {//download complete, close connection [Self.writehandle CloseFile]; Self.writehandle = nil; } if (Self.finishhandler) {Self.finishhandler (); }} @end
Large file download in iOS (single-threaded download)