我目前正在我的应用程序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];
}
}
答案 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
因此,您可以通过代码捕获所有连接错误,并在这种情况下实现正确的行为。