目标C:多次下载

时间:2013-05-17 04:20:44

标签: ios objective-c nsdata appstore-sandbox uidocumentinteraction

我正在尝试制作一个从在线服务器下载pdf文件的应用。 我做的是创建了3个按钮,它们有3个不同的URL并将其保存到应用程序的沙箱中并在iBooks中打开。

但它崩溃了应用程序,我有这个错误说...

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter' ***

这是我的代码: 按钮单击:

     if (sender.tag == 1) {
        pdfTag = 1;
        pdfSource1 = @"http://myweb.com/folder/folderagain/file1.pdf";
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:pdfSource1]];
        NSURLConnection *conn = [[NSURLConnection alloc] init];
        (void)[conn initWithRequest:request delegate:self];

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
        dispatch_async(queue, ^{
            dataSource1 = [NSData dataWithContentsOfURL:[NSURL URLWithString:pdfSource1]];
            dispatch_sync(dispatch_get_main_queue(), ^{
            });
            pdfSourcePath1 = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"myPDF1.pdf"];
            NSLog(@"PDF path: %@",pdfSourcePath1);
            [dataSource1 writeToFile:pdfSourcePath1 atomically:YES];
        });

    } else if (sender.tag == 2) {
        pdfTag = 2;
        pdfSource2 = @"http://myweb.com/folder/folderagain/file2.pdf";
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:pdfSource2]];
        NSURLConnection *conn = [[NSURLConnection alloc] init];
        (void)[conn initWithRequest:request delegate:self];

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
        dispatch_async(queue, ^{
            dataSource2 = [NSData dataWithContentsOfURL:[NSURL URLWithString:pdfSource2]];
            dispatch_sync(dispatch_get_main_queue(), ^{
            });
            pdfSourcePath2 = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"myPDF2.pdf"];
            NSLog(@"PDF path: %@",pdfSourcePath2);
            [dataSource2 writeToFile:pdfSourcePath2 atomically:YES];
        });
    } else if (sender.tag == 3) {
        pdfTag = 3;
        pdfSource3 = @"http://myweb.com/folder/folderagain/file3.pdf";
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:pdfSource3]];
        NSURLConnection *conn = [[NSURLConnection alloc] init];
        (void)[conn initWithRequest:request delegate:self];

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
        dispatch_async(queue, ^{
            dataSource3 = [NSData dataWithContentsOfURL:[NSURL URLWithString:pdfSource3]];
            dispatch_sync(dispatch_get_main_queue(), ^{
            });
            pdfSourcePath3 = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"myPDF3.pdf"];
            NSLog(@"PDF path: %@",pdfSourcePath3);
            [dataSource3 writeToFile:pdfSourcePath3 atomically:YES];
        });
    }

打开文件:

     if (pdfTag == 1) {
     NSURL *url = [NSURL fileURLWithPath:pdfSourcePath1];
     docController1 = [UIDocumentInteractionController interactionControllerWithURL:url];

     docController1.delegate = self;

     [docController1 presentOpenInMenuFromRect:btn1.frame inView:self.view animated:YES];
    } else if (pdfTag == 2) {
        NSURL *url = [NSURL fileURLWithPath:pdfSourcePath2];
        docController2 = [UIDocumentInteractionController interactionControllerWithURL:url];

        docController2.delegate = self;

        [docController2 presentOpenInMenuFromRect:btn2.frame inView:self.view animated:YES];
    } else if (pdfTag == 3) {
        NSURL *url = [NSURL fileURLWithPath:pdfSourcePath3];
        docController2 = [UIDocumentInteractionController interactionControllerWithURL:url];

        docController2.delegate = self;

        [docController2 presentOpenInMenuFromRect:btn3.frame inView:self.view animated:YES];
    }

我希望我能找到答案。

3 个答案:

答案 0 :(得分:0)

在您的代码中,我无法看到您在任何地方使用过的API initFileURLWithPath

以下是我对你的任务的建议,

以下是使用服务器文件路径将远程Pdf作为NSData获取并存储在应用程序沙箱中的代码。

     NSData *pdfData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:bookUrlString]];
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
     NSString *documentsDirectory = [paths objectAtIndex:0];
     NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"myPDF.pdf"];
     [pdfData writeToFile:filePath atomically:YES

根据我对此目的的理解,这不需要任何NSURLRequestNSURLConnection ......

答案 1 :(得分:0)

网络是一项复杂的任务,我绝不会建议您使用-initWithURL方法下载或上传文件,因为它不是异步的,会阻塞主线程。你应该使用NSURLConnection类及其委托方法,或者只接受队列和完成块的惊人的类方法。
你使用NSURLConnection做了很奇怪的事情,但你使用的是..WithURL方法你应该和他们一起去。
Web上有不同的下载管理器可以帮助您完成整个过程,因为它们包装了NSURLConnection类和委托方法。
有:

  1. AFNetworking link
  2. MKNetworking(我最喜欢的)link

答案 2 :(得分:0)

只要文件的大小很小,

NSData dataWithContentsOfURL就可以正常工作。

我不建议您使用此方法下载大文件,而是使用NSURLConnectionAFNetworking

以下答案解释了如何使用NSURLConnectionAFNetworking下载文件: https://stackoverflow.com/a/16454923/2548707