【问题标题】:UIImage saved to app documents directory does not persist between app sessions保存到应用程序文档目录的 UIImage 在应用程序会话之间不会持续存在
【发布时间】:2015-09-12 21:33:12
【问题描述】:

我的应用程序旨在从用户视频中制作缩略图,并将这些缩略图保存在应用程序文档目录中以供以后在 UICollectionView 中使用。但是,似乎图像只是临时保存的,因为重新启动应用程序后无法访问它们。我做错了什么?

我正在使用许多以前的 SO 帖子中的代码,例如这个:Storing images locally on an iOS device,所以我不确定我引入了什么错误。

我正在保存从用户录制的视频中截取的缩略图,如下所示:

  NSArray *paths2 = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
    NSURL *documentsDirectory = [paths2 lastObject];//[self documentsDirectoryURL];
    NSString *prefixString = @"IdlingVideo";
    NSString *guid = [[NSProcessInfo processInfo] globallyUniqueString] ;
    NSString *uniqueFileName = [NSString stringWithFormat:@"%@_%@.png", prefixString, guid];        
    NSURL *saveLocation = [documentsDirectory URLByAppendingPathComponent:uniqueFileName];
    NSString *imagePath =saveLocation.path;
    [UIImagePNGRepresentation(newImage) writeToURL:saveLocation atomically:YES];
   NSURL *filePathCompressed = [[NSURL alloc] initFileURLWithPath: imagePath];

我也试过这个:

   NSArray *paths2 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
   NSString *documentsDirectory = [paths2 objectAtIndex:0];

在这两种情况下,我运行应用程序时一切正常。缩略图似乎已保存并显示在我的UICollectionView 中。在创建UICollectionViewCell 时,我还会记录该文件是否存在的确认信息:

if ([fileManager fileExistsAtPath:self.complaint.thumbnailURL.path]){
    NSLog(@"file exists at path %@", self.complaint.thumbnailURL.path);
}else{
    NSLog(@"file DOES NOT EXIST at path %@", self.complaint.thumbnailURL.path);
}

根据需要,当我在用户拍照后立即查看UICollectionView 时,会输出“文件存在”。因此,在一个会话中一切都很好。但是,当用户重新启动应用程序时,图像会丢失。当应用程序重新启动时,文件似乎丢失了。 UICollectionViewCell 中没有图像出现,并且记录器指示该文件不存在。

我做错了什么?

【问题讨论】:

  • 如何存储图片的路径?
  • 尝试打印两个路径,用于存储图像的路径和用于检索图像的路径并检查它们是否相同?
  • 我相信,这些文件仍然存在,但您尝试使用错误的 URL 获取它。你能告诉我们什么是self.complaint,你如何设置它的thumbnailURL属性
  • 你应该检查Document目录的内容,可能是文件在那里
  • 重新启动后,您是使用相对路径还是绝对路径来访问文件?我不认为绝对路径是稳定的。

标签: ios objective-c


【解决方案1】:

根据Apple's documentation ,Documents 目录的内容将一直存在,直到它们被应用程序明确删除。

下面的代码是我到目前为止一直用来获取文档目录路径的代码。因此,您似乎正在正确访问文档目录。

+ (NSString *) applicationDocumentsDirectory 
{    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}

很有可能在您的代码中某处明确删除文档目录的内容。

  1. 按 Cmd + Shift + F 。使用搜索文本“removeItemAtPath:”在项目中执行全局搜索。这是与NSFileManager 一起使用的方法,用于删除指定路径处的文件。
  2. 如果您在项目中找到 'removeItemAtPath: 搜索文本,请在该行添加断点。
  3. 运行应用程序并查看当您的应用程序进入前台时您的应用程序是否遇到该断点。如果是,则很有可能这是您面临的问题的主要原因。您可以跟踪函数调用跟踪以找出调用它的位置。

或替代

  1. 找出您机器上文档目录的位置,然后 在模拟器中运行您的应用。
  2. 检查文档目录是否有内容时 通过添加断点调用appDidFinishLaunching方法。
  3. 如果是,请继续使用 Xcode 调试器找出在哪个 指出内容被删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多