在iOS设备上本地存储图像

44
一些与iOS照片相关的应用程序将由该应用程序创建的图像存储在照片库以外的某个位置。例如,Fat Booth在应用程序启动时显示一个滚动列表,其中包含使用该应用程序创建的照片。请注意,这些照片会被持久化,而用户并没有明确将它们保存到照片库中。最简单的方法是什么来在iOS应用程序内保存和持久化图像? 我所熟悉的唯一持久存储方式是NSUserDefaults和密钥链。然而,我从未听说过这些用于存储诸如图像之类的较大数据。现在我想知道Core Data是否是最简单的方法。
3个回答

65

最简单的方法是将其保存在应用程序的“文档”目录中,并像这样使用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];

2
这里可能有点挑剔,但我认为NSPicturesDirectory比NSDocumentDirectory更合适。 - Trasplazio Garzuglio
1
@MarcoDinacci 为什么?它基本上只是另一个文件夹,不是吗? - Supertecnoboff

35

对于Swift:

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。这里获取更多信息。


5
问题涉及 Objective-C,而非 Swift。 - JasonMArcher
42
@JasonMArcher 我不同意你的看法,我搜索了Objective-C是因为在Swift中找不到答案。这对我有帮助,因为这正是我一开始要找的东西。 - Chris
我得到了“尝试设置非属性列表对象文件”的错误。 - Machado

7
您可以使用Core Data存储二进制数据来实现,但这并不被推荐。特别是对于照片,有一种更好的方法。您的应用程序有一个只有您的应用程序可以访问的文档/文件目录。我建议从这里开始了解相关概念和如何访问它。这相对简单明了。您可能想将它与Core Data相结合,以存储文件路径、元数据等信息。http://developer.apple.com/library/mac/#documentation/FileManagement/Conceptual/FileSystemProgrammingGUide/FileSystemOverview/FileSystemOverview.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接