我正在尝试将一个大的Keynote文件(~150MB)加载到UIWebView
中,并且我不断收到内存警告,我的应用程序崩溃了。
有解决方法吗?
打开这么大的文件而不在另一个应用程序中打开它们的正确方法是什么?
答案 0 :(得分:1)
当您直接从网址打开UIWebView
中的文件时,下载的内容会临时存储在RAM中。 RAM是整个设备的共享空间,必须执行其他与操作系统相关的任务。因此,你的应用程序因内存压力而被iOS杀死。资源危机。
建议您将内容直接写入后台NSDocumentsDirectory
中的文件中。稍后在UIWebView
加载文件。
据我所知,我可以建议你以下。
下载部分
预览部分
希望有所帮助。
答案 1 :(得分:0)
如果它是一个大文件,则您无法/不应该使用UIWebView
。
为什么呢?我试图显示一个带有几个图像的文档文件(docx),并且在抛出内存警告后我的应用程序崩溃了。原因很简单。虽然文件大小约为2.5 MB,但设备没有足够的RAM /内存来显示所有位图图像(嵌入在文档中)。使用Instruments调试问题表明,应用程序内存从30 MB增加到230 MB。我想你会经历类似的事情。
可能的解决方案:
不允许用户在其移动设备上打开大文件。当您收到内存警告时,或者正常停止/暂停UIWebView
加载过程。
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
if ([self.webView isLoading]) {
[self.webView stopLoading];
}
}
请尝试使用[UIApplication sharedApplication] openURL:]
方法。
请尝试使用UIDocumentInteractionController
。
UIDocumentInteractionController *documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:targetURL];
documentInteractionController.delegate = self;
BOOL present = [documentInteractionController presentPreviewAnimated:YES];
if (!present) {
// Allow user to open the file in external editor
CGRect rect = CGRectMake(0.0, 0.0, self.view.frame.size.width, 10.0f);
present = [documentInteractionController presentOpenInMenuFromRect:rect inView:self.view animated:YES];
if (!present) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Cannot preview or open the selected file"
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK", nil)
otherButtonTitles:nil, nil];
[alertView show];
}
}
注意:我没有尝试使用上述方法打开主题文件。要使用UIDocumentInteractionController
,您必须先下载该文件。
希望这有帮助。