应用重新运行后,通过 WriteToFile 命令写入的图像丢失
Posted
技术标签:
【中文标题】应用重新运行后,通过 WriteToFile 命令写入的图像丢失【英文标题】:Image written through WriteToFile command is missing after app rerun 【发布时间】:2016-10-23 12:44:52 【问题描述】:我正在编写一个应用程序,它从我的服务器下载图像并将它们存储在本地以供离线查看。我用来在本地存储图像的代码如下所示。除了存储图像之外,我还可以从路径(我单独存储)中读取图像。
但是,当我将代码从 Xcode 重新运行到 iPhone 时(无需从手机上卸载应用程序),存储的图像文件将会丢失。这是预期的吗?当我的应用程序在 App Store 上发布以及用户更新应用程序时,我会遇到类似的问题吗?当我在 Xcode 中更新某些代码时重新运行它们时,有没有办法让文件保持持久性?
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *imagePath =[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"file.jpeg",]];
if (![imageData writeToFile:imagePath atomically:YES])
// Handling when there is an error
NSLog(@"Failed to store file at path %@",imagePath);
stored.text = @"";
else
// Handling when write is successful
NSLog(@"Imaged stored path is %@",imagePath);
stored.text = imagePath;
[imageView setImage:image];
读取图片的代码如下:
NSString *imagePathToRead = stored.text;
NSLog(@"Retrieve image from %@",imagePathToRead);
UIImage *image = [UIImage imageWithContentsOfFile:imagePathToRead];
[imageView setImage:image];
【问题讨论】:
Nslog 图像名称。如果文档的图像名称和您当前的图像名称相同,那么它应该可以工作。 我刚刚有NSLog,路径完全一样,但是从Xcode重新运行后,我不再能够检索UIImage。 使用再次运行应用时加载图像的代码更新您的问题(并包括用于确定图像路径的确切代码)。 我已经用关于如何阅读图像的代码更新了我的问题。只要不从 Xcode 重新运行,这些代码就没有问题。这意味着在我在电话上运行它们之后,它会正常工作。如果我从 Xcode 重新运行它们(在我更新了其他地方的任何代码之后),我不再能够从确切的路径中提取图像。 您没有显示stored.text
的来源。仅供参考 - 切勿存储完整路径。仅存储相对于 Documents 文件夹(或您碰巧使用的任何文件夹)的路径。始终根据 Documents 文件夹的运行时确定构建完整路径并附加相对路径。
【参考方案1】:
我在这里发布了 rmaddy 的答案,它解决了我面临的问题。我在这里发帖是为了让其他人在遇到类似问题时也能从中受益。
对于存储部分:
stored.text 不应该存储完整路径:
stored.text = imagePath;
我应该只存储@"file.jpeg"。
对于阅读部分:
当我想读取路径而不是下面的代码时,我应该始终重新生成下面的完整路径:
NSString *imagePathToRead = stored.text;
更正的代码是:
NSString *imagePathToRead = stored.text;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *imagePath =[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:imagePathToRead]];
NSLog(@"Retrieve image from %@",imagePath);
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
这解决了问题,即使通过 Xcode 重新安装了应用程序,也可以读取图像。
【讨论】:
以上是关于应用重新运行后,通过 WriteToFile 命令写入的图像丢失的主要内容,如果未能解决你的问题,请参考以下文章
从命令行构建 APK 后使用 zopfli 重新压缩运行 zipalign 以使其更小
通过代码创建和执行的 SSIS 包需要在多次运行后重新启动服务
Aws Elasticbean 不运行我的 .jar 应用程序