保存到应用程序文档目录的UIImage在应用程序会话之间不会保留

时间:2015-06-26 03:46:48

标签: ios objective-c

我的应用程序旨在从用户视频制作缩略图,并将这些缩略图保存在应用程序文档目录中,以便以后在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中没有图像,记录器表示该文件不存在。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

根据Apple's documentation,文档目录的内容将一直存在,直到应用程序显式删除它们为止。

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

+ (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. 运行应用程序,看看当您的应用程序到达前台时应用程序是否遇到该断点。如果是,那么这很可能是您面临的问题的主要原因。您可以跟进函数调用跟踪以找出它的调用位置。
  4. 或者

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