Ios 以默认值保存图像

Ios 以默认值保存图像,ios,objective-c,image,nsuserdefaults,Ios,Objective C,Image,Nsuserdefaults,我需要在我的应用程序中存储和检索图像,我首先想到这样做: [[NSUserDefaults standardUserDefaults] setObject:UIImagePNGRepresentation(image) forKey:key]; NSData* imageData = [[NSUserDefaults standardUserDefaults] objectForKey:key]; UIImage* image = [UIImage imageWithDa

我需要在我的应用程序中存储和检索图像,我首先想到这样做:

[[NSUserDefaults standardUserDefaults] setObject:UIImagePNGRepresentation(image)            forKey:key];

NSData* imageData = [[NSUserDefaults standardUserDefaults] objectForKey:key];
UIImage* image = [UIImage imageWithData:imageData];
但我知道这不是推荐的方法。最好的方法是什么


(我知道这个问题有重复的地方,但我还不知道怎么做)

将图像保存在文档目录中,然后将文件名保存在数据库中(可能是核心数据)、另一种文件格式或
NSUserDefaults

NSUserDefaults
并不是存储应用程序数据的好方法

从UIImage实例获取数据 UIImagePNGRepresentation()或
UIImageJPEGRepresentation()
。然后将数据保存到文件中。使用
imageWithContentsOfFile:
恢复UIImage

要获取文档目录的路径,请执行以下操作:

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

您必须从
UIImageJPEGRepresentation()
获取数据,并将其存储在
NSData
对象或类似对象中,以便将其“plist serializable”存储在
NSUserDefaults
中,但正如其他人所说,最好将图像作为图像文件存储在文件系统的某个位置,并将文件路径或文件URL存储在
NSUserDefaults

中。最简单的方法是直接将内容保存到iOS设备,并将路径存储在NSUserDefaults中

首先将图像转换为文件并保存到手机

UIImage *image = // your image
NSData *pngImageData = UIImagePNGRepresentation(image);

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

NSString *fileName = [NSString stringWithFormat:@"%@/imageName.png",
                      documentsDirectory];
[pngImageData writeToFile:fileName atomically:YES];
我的同事威胁说要否决我的投票,因为他反对在NSUserDefaults中存储文件路径,因为,你不应该在NSUserDefaults中存储任何超级动态的东西,你应该存储会话密钥、令牌值、甚至用户名之类的东西,不经常更改或非常严格的东西

建议是,如果您绝对拒绝CoreData,则创建一个属性列表并将字符串名称存储在其中

要将imagePath存储在plist中,请执行以下操作:

NSString *textPath = [[NSBundle mainBundle] pathForResource:@"propertyListName" ofType:@"plist"];
NSDictionary *thisDict = [NSDictionary dictionaryWithContentsOfFile:textPath];
NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithDictionary:thisDict];
mutableDictionary[@"key"] = fileName;
[mutableDictionary writeToFile:resultsPath atomically:YES];
要从plist中检索图像,请执行以下操作

NSString *textPath = [[NSBundle mainBundle] pathForResource:@"propertyListName" ofType:@"plist"];
NSDictionary *thisDict = [NSDictionary dictionaryWithContentsOfFile:textPath];
NSString *imagePath = thisDict[@"key"];
NSData *imageData = [NSData dataWithContentsOfFile:filePath];
UIImage *myImage = [UIImage imageWithData:imageData];
不要使用此NSUserDefaults选项,因为它是错误的,但如果您愿意,您可以这样做

[[NSUserDefaults standardUserDefaults] setObject:fileName forKey:@"key"];
[[NSUserDefaults standardUserDefaults] synchronize];
现在,它很容易保存,便于您检索。当您要检索图像时

NSString *filePath = [[NSUserDefaults standardUserDefaults] objectForKey:@"key"];
NSData *imageData = [NSData dataWithContentsOfFile:filePath];
UIImage *myImage = [UIImage imageWithData:imageData];
然后使用myImage作为图像。请记住,设置和检索时密钥必须相同


存储图像的最佳方式取决于应用程序的功能

如果您有超过100k的图像,您可能希望通过coredata将其手动保存到iphone的硬盘上,因为这样可以更快地加载图像

但是,如果您的内存不足,那么我建议您将图像作为二进制数据存储在核心数据中

与文件系统相比,使用coredata的好处:

  • 更好的iCloud同步支持
  • 无需管理硬盘上的映像,也无需管理用作“持久性存储”的映像(coredata/nsuserdefaults/custom)
  • 您可以将图像绑定到其他数据,例如名称、创建日期等

文件系统与coredata的一些有趣性能信息:

存储图像的最佳方式取决于应用程序的功能

如果您有超过100k的图像,您可能希望通过coredata将其手动保存到iphone的硬盘上,因为这样可以更快地加载图像

但是,如果您的内存不足,那么我建议您将图像作为二进制数据存储在核心数据中

与文件系统相比,使用coredata的好处:

  • 更好的iCloud同步支持
  • 无需管理硬盘上的映像,也无需管理用作“持久性存储”的映像(coredata/nsuserdefaults/custom)
  • 您可以将图像绑定到其他数据,例如名称、创建日期等

关于文件系统与coredata的一些有趣的性能信息:

不要这样做。只需将图像写入文件
NSUserDefaults
并不意味着要存储这么多数据。您可以将图像存储到文档目录和NSUserDefaults的url路径。您需要更清楚地了解您的要求。你是在问做这些事情的推荐方法/最佳方法吗。或者如何做这些事情,如果你想知道你需要如何具体说明你想知道的。我正在寻找最简单和最好的解决方案,以及如何完成这些工作。所有这些显然都得到了图像的数据表示形式,到文档目录的路径,并写入数据我也要问这个问题,我该怎么做呢?网络上有很多教程学习如何将图像保存到设备上的文件中。正如Iasaac所提到的。我写了一些类,它利用了缓存和在磁盘上存储图像的优势。也许它对您有所帮助。此外,NSUserDefaults是一个标准plist文件,用于最简单的数据(如设置和简单首选项)。你根本不应该用它来做这样的事情。如果您想使用plist来实现此目的,请制作另一个plist。虽然,您应该有一个模型对象设置,可以将这些图像名称附加到它们,并且您应该将这些模型存储在CoreData或NSCoding中。NSUserDefaults应该可以,如果有Isaac,不要鼓励该人滥用他不应该使用的东西,因为它不是为>设计的。