【问题标题】:Downloading PDF In iOS App Freezes在 iOS 应用程序中下载 PDF 冻结
【发布时间】:2013-06-27 05:17:57
【问题描述】:

我的应用允许将 PDF 下载到设备。但是,在下载 PDF 时,该应用程序在下载完成之前无法执行任何操作。我该怎么做才能在下载过程中处理其他操作?这是我目前下载的。

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];

【问题讨论】:

  • 您正在将 pdf 作为同步请求下载,因此它将阻塞该线程,直到所有数据都从服务器下载,而不是在主线程上下载,而是使用异步任务下载它。

标签: ios pdf nsurlconnection


【解决方案1】:

你需要在后台线程中运行它,像这样:

    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];
    })

【讨论】:

  • 完美!当文件完成写入路径时是否有通知器?
  • 在 '[data writeToFile:pdfPath atomically:YES];' 行之后该文件已完成。如果要通知 UI,请在主线程内进行调度。看看这个链接:stackoverflow.com/questions/11530050/…
  • 请直接使用NSURLConnection,使用其专用的异步 API,而不是像这样将后台同步操作混杂在一起。在这里使用DISPATCH_QUEUE_PRIORITY_HIGH 也没有任何好处
【解决方案2】:

使用 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多