How to monitor pdf download process in iphone sdk

2019-08-29 15:20发布

问题:

In my application i need to download pdf file from url.i know how to download pdf file from url and store in local document directory.But i need to show downloading process and i want to know whether download is completed.Please any body give an idea..

Here My code:

 NSData *pdfData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.msy.com.au/Parts/PARTS.pdf"]];

//Store the Data locally as PDF File

NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle]  resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents"]];

NSString *filePath = [resourceDocPath stringByAppendingPathComponent:@"myPDF.pdf"];

[pdfData writeToFile:filePath atomically:YES];

回答1:

Use ASIHTTPRequest for download file. for below code I had used ASIHTTPRequest

float currentProgress;
UILabel *dwnLbl;
UIProgressView * myProgressIndicator;
UIProgressView *progressBar;
@property (nonatomic, retain) ASIHTTPRequest *rqstForAudio;


-(void)viewDidLoad{
     self.av=[[UIAlertView alloc] initWithTitle:@"Downloading.." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
    [self.actV setFrame:CGRectMake(125, 60, 37, 37)];

    dwnLbl = [[UILabel alloc] initWithFrame:CGRectMake(45, 30, 200, 37)];
    dwnLbl.textAlignment = UITextAlignmentCenter;
    dwnLbl.font = [UIFont boldSystemFontOfSize:20];
    dwnLbl.backgroundColor = [UIColor clearColor];
    dwnLbl.textColor = [UIColor whiteColor];

    progressBar = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar];
   [progressBar setFrame:CGRectMake(45, 65, 200, 20)];
   progressBar.progress = 0;
   [self.av addSubview:dwnLbl];
   [self.av addSubview:progressBar];
 }
 -(void)downLoadBook{
    NSString *strAudioURL=@"http://www.msy.com.au/Parts/PARTS.pdf"
    // check first locally exists or not
    NSString *strPathToAudioCache=[NSString stringWithFormat:@"%@/%@",
                                   [(NSArray*)NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0],
                                   AudioFolder];

    NSDictionary *dOfAudios=[NSDictionary dictionaryWithContentsOfFile:strPathToAudioCache];
    if([dOfAudios valueForKey:strAudioURL]) {
    } else {
        self.av.title = @"Downloading..";
        [self.av show];
        NSString  *pdf = @"bookTitle.pdf";


        NSURL *audioURL = [NSURL URLWithString:strAudioURL];
        NSString *strPathToDownload=[NSString stringWithFormat:@"%@/%@",[(NSArray*)NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0],pdf];
        [self.rqstForAudio setDownloadProgressDelegate:myProgressIndicator];

        if(!self.rqstForAudio || [self.rqstForAudio isFinished]) {
            self.rqstForAudio=[ASIHTTPRequest requestWithURL:audioURL];
            [self.rqstForAudio setDelegate:self];
            [self.rqstForAudio setDownloadProgressDelegate:self];
            [self.rqstForAudio setAllowResumeForFileDownloads:YES];
            [self.rqstForAudio setCachePolicy:ASIUseDefaultCachePolicy];
            [self.rqstForAudio setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
            [self.rqstForAudio setDidFailSelector:@selector(failedToLoad:)];
            [self.rqstForAudio setDidFinishSelector:@selector(finishedLoading:)];
            [self.rqstForAudio setDownloadCache:[ASIDownloadCache sharedCache]];
            [self.rqstForAudio setDownloadDestinationPath:strPathToDownload];
            [self.rqstForAudio startAsynchronous];
        }
    }
}



- (void)failedToLoad:(ASIHTTPRequest*)request {
    [self.av dismissWithClickedButtonIndex:0 animated:YES];
    NSLog(@"failed to download");
    UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"MESSAGE" message:@"Failed to Download" delegate:self cancelButtonTitle:RETRY otherButtonTitles:nil, nil];
    av.delegate = self;
    [av show];
}

- (void)finishedLoading:(ASIHTTPRequest*)request {
  NSLog(@"finished loading");
  NSString *strPathToAudioCache=[NSString stringWithFormat:@"%@",
                               [(NSArray*)NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]];

 NSMutableDictionary *dOfAudios=[NSMutableDictionary dictionaryWithContentsOfFile:strPathToAudioCache];

 if([dOfAudios allKeys].count>0) {
    [dOfAudios setValue:[request downloadDestinationPath] forKey:[[request url] description]];
 } else {
    dOfAudios=[NSMutableDictionary dictionary];
    [dOfAudios setValue:[request downloadDestinationPath] forKey:[[request url] description]];
 }
  [self.av dismissWithClickedButtonIndex:0 animated:YES];
  [dOfAudios writeToFile:strPathToAudioCache atomically:YES];
}

- (void)request:(ASIHTTPRequest *)request didReceiveBytes:(long long)bytes{
    [self setProgress:[myProgressIndicator progress]];
}
 - (void)setProgress:(float)progress
{
   currentProgress = progress;
   if (!progress == 0.0) {
   }
   if(currentProgress*100 == 100.00){
      self.av.title = @"Finishing..";
   }
   progressBar.progress = currentProgress;
   dwnLbl.text = [NSString stringWithFormat:@"%.2f%%",currentProgress*100];
}

EDIT

You can used the NSURLSession method to implement such scenario NSURLSession



回答2:

I'd highly recommend taking a look at ASIHTTPRequest for easy file downloading.

where the numbers of the functionality thru you can able to use the download progress.