如何将文件下载到iPhone的文件系统?

时间:2011-03-18 17:11:14

标签: iphone objective-c xcode ios

我想从我的应用程序中将一堆pdf从网站下载到iPhone文件系统。 因为每次启动应用程序时我都不想下载文件。

在文档中我发现了一个名为“dataWithContentsOfURL”的函数,但示例代码对我没有帮助。这是正确的方法,还是有更简单的解决方案?

有人可以给我一两个小费吗? ; - )

迎接最大

5 个答案:

答案 0 :(得分:5)

我建议使用ASIHTTPRequest,它编写得很好,文档化且易于使用,这是我的一个应用程序下载类的快速示例,它使用ASIHTTPRequest下载JSON文件:

-(void)downloadJSONData:(NSString *)path destination:(NSString *)destination secure:(BOOL)secure {

    if (![self queue]) {
        [self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
    }

    NSFileManager *fileManager = [NSFileManager defaultManager];
    [fileManager removeItemAtPath:destination error:NULL];

    NSURL *url = [NSURL URLWithString:path];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

    if(secure){
        [request addRequestHeader:@"Authorization" value:[NSString stringWithFormat:@"Basic %@",[ASIHTTPRequest base64forData:[[NSString stringWithFormat:@"%@:%@",self.username,self.password] dataUsingEncoding:NSUTF8StringEncoding]]]];
    }
    [request setDelegate:self];
    [request setDidFinishSelector:@selector(requestDone:)];
    [request setDidFailSelector:@selector(requestWentWrong:)];
    [request setDownloadDestinationPath:destination];
    [[self queue] addOperation:request]; //queue is an NSOperationQueue
}

我会看一下how-to-use page,因为它包含了你需要知道的一切。

答案 1 :(得分:1)

你走在正确的轨道上

-(void)downloadURL:(NSURL *)theUrl toLocalFileURL:(NSURL *)localURL
{
     NSData *dlData = [NSData dataWithContentsOfURL:theURL];
     [dlData writeToURL:localURL atomically:YES];
}

所以,只研究如何为本地和远程对象创建NSURL,并且你已经完成了设置。

答案 2 :(得分:1)

是的,您可以根据需要下载文件(延迟加载)。

何时需要访问文件。在文档目录中检查文件。在第二个答案中,它被指定。使用douments路径附加文件名。使用NSFileManager的isReadableFileAtPath:instance方法检查是否存在可读文件。如果它返回false,则开始从网站下载pdf。

请注意创建一个异步下载文件的类。您可以使用NSURLconnection启动请求及其委托方法来处理其内容下载内容后将其写入文档文件夹。

如果您可以创建异步下载类,则可以启动并行下载并最大限度地利用带宽。

通过异步下载,您可以确保即使在下载文件时您的应用程序也能响应。

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/Reference/Reference.html

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

问候,

Jackson Sunny Rodrigues

答案 3 :(得分:1)

除非您在主线程之外的其他位置执行,否则请勿使用dataWithContentsOfURL:。它是一个阻塞API,也是一个访问网络的API。这是糟糕的用户体验的一个秘诀。

想一想:您使用阻止API来访问网络,但网络已关闭或非常慢。主线程现已被阻止,因此您的用户界面不响应用户交互。用户感到沮丧,并尝试使用您放在UI上的方便按钮取消下载,但“OH NO!”它不起作用,因为UI被阻止。

不要在主线程上使用阻止API。

您应该查看NSURLConnection的文档,以及下载数据的异步加载方法。

答案 4 :(得分:0)

你应该使用

NSData* pdf_data = [NSData dataWithContentsOfFile: @"file_path"];

其中file_path是您保存文件的路径(通常是Documents或Library目录)。

要保存数据,请使用:

[pdf_data writeToFile: @"file_path" atomically: YES];

要获取文档目录的路径,您可以使用:

- (NSString *)applicationDocumentsDirectory {
    NSArray *paths = 
      NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}