44

一些 iOS 与照片相关的应用程序将使用该应用程序创建的图像存储在照片库以外的位置。例如,Fat Booth 显示了在应用启动时使用应用创建的照片的滚动列表。请注意,这些照片不会被用户明确保存到照片库中。在 iOS 应用程序中保存和持久化图像的最简单方法是什么?

我熟悉的唯一持久存储是 NSUserDefaults 和密钥链。但是,我从未听说过这些用于存储更大的数据,例如图像。现在我想知道核心数据是否是最简单的方法。

4

3 回答 3

65

最简单的方法是将其保存在应用程序的 Documents 目录中,并使用 NSUserDefaults 保存路径,如下所示:

NSData *imageData = UIImagePNGRepresentation(newImage);

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

NSString *imagePath =[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png",@"cached"]];

NSLog(@"pre writing to file");
if (![imageData writeToFile:imagePath atomically:NO]) 
{
    NSLog(@"Failed to cache image data to disk");
}
else
{
    NSLog(@"the cachedImagedPath is %@",imagePath); 
}

然后将 imagePath 保存在 NSUserDefaults 中的某个字典中,或者您想要的任何内容中,然后检索它只需执行以下操作:

 NSString *theImagePath = [yourDictionary objectForKey:@"cachedImagePath"];
 UIImage *customImage = [UIImage imageWithContentsOfFile:theImagePath];
于 2013-01-25T23:36:18.813 回答
35

对于斯威夫特:

let imageData = UIImagePNGRepresentation(selectedImage)
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let imagePath = paths.stringByAppendingPathComponent("cached.png")

if !imageData.writeToFile(imagePath, atomically: false)
{
   println("not saved")
} else {
   println("saved")
   NSUserDefaults.standardUserDefaults().setObject(imagePath, forKey: "imagePath")
}

对于 Swift 2.1:

let imageData = UIImagePNGRepresentation(selectedImage)
let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
let imageURL = documentsURL.URLByAppendingPathComponent("cached.png")

if !imageData.writeToURL(imageURL, atomically: false)
{
    print("not saved")
} else {
    print("saved")
    NSUserDefaults.standardUserDefaults().setObject(imageData, forKey: "imagePath")
}

stringByAppendingPathComponent在 Swift 2.1 中不可用,因此您可以在此处使用URLByAppendingPathComponent. 获取更多信息

于 2014-11-25T10:46:40.257 回答
7

可以通过存储二进制数据来处理核心数据,但不建议这样做。有一个更好的方法 - 特别是对于照片。您的应用程序有一个只有您的应用程序可以访问的文档/文件目录。我建议从这里开始了解概念以及如何访问它。它相对简单。您可能希望将其与核心数据相结合以存储文件路径、元数据等。http://developer.apple.com/library/mac/#documentation/FileManagement/Conceptual/FileSystemProgrammingGUIide/FileSystemOverview/FileSystemOverview.html

于 2013-01-25T23:30:43.617 回答