应用重新运行后,通过 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 命令写入的图像丢失的主要内容,如果未能解决你的问题,请参考以下文章

Mac Terminal 重新启动后无法运行大多数命令

从命令行构建 APK 后使用 zopfli 重新压缩运行 zipalign 以使其更小

通过代码创建和执行的 SSIS 包需要在多次运行后重新启动服务

Aws Elasticbean 不运行我的 .jar 应用程序

StringByAppendingPathComponent() 和 WriteToFile()

writeToFile:atomically: 不保存新的 plist 数据