2013-06-27 3 views
0

Мое приложение позволяет загрузить PDF-файл на устройство. Однако, в то время как PDF-файл загружается, приложение не может ничего сделать, пока загрузка не завершится. Как я могу это сделать, чтобы другие действия могли быть обработаны во время загрузки? Это то, что я до сих пор загружал.Загрузка PDF-файла в приложение iOS Freezes

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

Отлично! Есть ли уведомитель, когда файл закончил запись на путь? – user717452

+1

после строки '[data writeToFile: pdfPath atomically: YES];' файл закончен. Если вы хотите уведомить пользовательский интерфейс, сделайте отправку внутри основного потока. Взгляните на эту ссылку: 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); 
}