检索远程文件时,由于连接速度慢而导致应用程序崩溃

时间:2012-03-23 13:15:50

标签: ios

我目前正在我的应用程序didFinishLaunchingWithOptions中使用一个函数来检索文件,并将其保存到应用程序目录中。

我发现当连接较弱时,应用程序会在发生这种情况时崩溃。我读到苹果在崩溃应用程序之前有20秒的时间限制。它是否正确?如果是这样,我相信这会导致我的问题,因为应用程序完美无缺,除了处于非常弱的连接之外。

我如何修改下面的逻辑以尝试补偿?

- (void)writeJsonToFile
{   
//applications Documents dirctory path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

//live json data url
NSString *stringURL = @"http://link-to-my-data.json";
NSURL *url = [NSURL URLWithString:stringURL];
NSData *urlData = [NSData dataWithContentsOfURL:url];

//attempt to download live data
if (urlData)
{   
    NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"data.json"];
    [urlData writeToFile:filePath atomically:YES];
}
//copy data from initial package into the applications Documents folder
else
{
    //file to write to
    NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"data.json"];

    //file to copy from
    NSString *json = [ [NSBundle mainBundle] pathForResource:@"data" ofType:@"json" inDirectory:@"html/data" ];
    NSData *jsonData = [NSData dataWithContentsOfFile:json options:kNilOptions error:nil];

    //write file to device
    [jsonData writeToFile:filePath atomically:YES];
}

}

3 个答案:

答案 0 :(得分:5)

在主线程上运行这类事情是一个非常糟糕的主意:我认为你是 - 基本上,当你等待网络操作完成时,你将阻止整个UI。

dataWithContentsOfURL对于这类事情不是一个好主意。使用NSURLConnection或其中一个包装库(如AFNetworking)要好得多,因为您可以处理类似连接超时的情况。

这些库还具有内置方法来异步下载数据,这可以防止主UI线程被锁定。

答案 1 :(得分:1)

何时需要下载此数据?

根据答案,您可以在线程内调用该方法。这将阻止主线程阻塞。

即使从一开始就需要数据,您只需创建一个加载器并在后台下载该文件,然后在下载该文件后激活该应用程序。

答案 2 :(得分:1)

我认为更加独立于NSData *urlData = [NSData dataWithContentsOfURL:url];的内部实现,您应该基于NSURLConnection实现自己的下载类。

要阅读的链接:

URL Loading System Programming Guide

NSURLConnection Class Reference

NSURLConnectionDelegate Protocol Reference

因此,您可以通过代码捕获所有连接错误,并在这种情况下实现正确的行为。