2013-06-27 54 views
0

我的應用程序允許將PDF下載到設備。但是,在下載PDF時,應用程序無法做任何事情,直到下載完成。我怎樣才能做到這一點,以便在下載過程中處理其他操作?這是我迄今爲止下載的內容。下載PDF在iOS應用程序中凍結

RSSEntry *entry = [_allEntries objectAtIndex:indexPath.row]; 
      NSString *urlString = entry.articlePDF; 
      NSURL *url = [NSURL URLWithString:urlString]; 

      NSData *data = [NSData dataWithContentsOfURL:url]; 

      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *filename = [entry.articleTitle stringByAppendingString:@".pdf"]; 
      NSString *removed = [filename stringByReplacingOccurrencesOfString:@"/" withString:@""]; 
      NSString *documentsDirectory = [paths objectAtIndex:0]; 

      NSString *pdfPath = [documentsDirectory stringByAppendingPathComponent: removed]; 
      NSLog(@"Downloadstarted%@", pdfPath); 
      [data writeToFile:pdfPath atomically:YES]; 
+1

您正在下載的PDF作爲同步請求,因此將阻止直到從服務器下載所有數據,而不是在主線程上下載它使用異步任務下載它。 –

回答

0

您需要在後臺線程中運行,這樣的:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 

RSSEntry *entry = [_allEntries objectAtIndex:indexPath.row]; 
     NSString *urlString = entry.articlePDF; 
     NSURL *url = [NSURL URLWithString:urlString]; 

     NSData *data = [NSData dataWithContentsOfURL:url]; 

     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *filename = [entry.articleTitle stringByAppendingString:@".pdf"]; 
     NSString *removed = [filename stringByReplacingOccurrencesOfString:@"/" withString:@""]; 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 

     NSString *pdfPath = [documentsDirectory stringByAppendingPathComponent: removed]; 
     NSLog(@"Downloadstarted%@", pdfPath); 
     [data writeToFile:pdfPath atomically:YES]; 
    }) 
+0

完美!當文件寫入路徑時是否有通告? 'data writeToFile:pdfPath atomically:YES]'後的 – user717452

+1

;'該文件已完成。如果您想通知UI,請在主線程內部進行調度。看看這個鏈接:http://stackoverflow.com/questions/11530050/perform-ui-changes-on-main-thread-using-dispatch-async-or-performselectoronmaint –

+0

請直接使用'NSURLConnection',它的專用**異步** API,而不是像這樣拼湊背景同步操作。在這裏使用'DISPATCH_QUEUE_PRIORITY_HIGH'也沒有任何好處 –

-1

使用ASIHTTPRequest下載

self.request = [ASIHTTPRequest requestWithURL:pdflinkURL]; 
[self.request setDidFinishSelector:@selector(requestedPDFFinished:)]; 
[self.request setDidFailSelector:@selector(requestedPDFFailed:)]; 
[self.request setShouldContinueWhenAppEntersBackground:YES]; 
self.request.delegate = self; 
[self.request setDownloadProgressDelegate:self]; 
[self.request startAsynchronous]; 

- (void)requestedPDFFinished:(ASIHTTPRequest *)req 
{ 
    NSData *recievedData = [req responseData]; 
    // Save top Document Directory 
} 
//sagar change 
- (void)requestedPDFFailed:(ASIHTTPRequest *)req 
{ 
    NSLog(@"%@",req.error); 
}