通过NSUserDefaults将UIImage存储在iPhone内存中

时间:2011-08-24 16:54:11

标签: ios uiimage nsuserdefaults nsmutabledictionary

我使用ASIHTTPRequest库来下载图片,我将我的图片存储在NSMutableDictionnary(key = url,value = UIImage)中,这允许我下载我的每个视图所需的图片一次。这部分效果很好。

现在我想在iPhone内存中存储名为“imagesDownloaded”的NSMutableDictionnary,为我的所有应用程序下载一次每个图像,感谢这段代码

UIImage *img = [[UIImage alloc] initWithData:[request responseData]];
[imagesDownloaded setValue:img forKey:request.url.description];
userDatas = [NSUserDefaults standardUserDefaults];
[userDatas setValue:imagesDownloaded forKey:@"Pictures"];
[userDatas synchronize];

但是当我这样做时它不起作用:

NSLog(@"%@", [userDatas objectForKey:@"Pictures"]);

值始终为“null”。

怎么了?

由于

3 个答案:

答案 0 :(得分:1)

正如其他人所说,您无法将图像直接保存到NSUserDefaults

虽然您可以将其保存为编码字符串或其他可以保存在NSUserDefaults中的字符串,但由于图像数据比普通NSUserDefaults数据大得多,因此如果性能不佳将图像保存到其中。

最好的方法是将图像作为文件保存到iOS的文件系统中,然后只需将图像的路径保存到NSUserDefaults

答案 1 :(得分:0)

您无法将图像直接存储到NSUserDefaults中。来自the documentation

  

NSUserDefaults类提供了便于访问的方法   常见类型,例如浮点数,双精度数,整数,布尔值和URL。一个   默认对象必须是属性列表,即(或   对于集合的实例组合:NSDataNSString,   NSNumberNSDateNSArrayNSDictionary。如果你想存储任何   在其他类型的对象中,通常应将其存档以创建   NSData的实例。

由于您已拥有图像数据([request responseData]),请尝试将其存储为默认值。您也可以尝试将NSData对象直接放入数组而不是UIImage个对象,然后存储它。

要了解有关使用用户默认值的详情,请查看Apple的User Defaults Programming Topics

答案 2 :(得分:0)

您要存储到用户默认值(及其所有子节点)的对象必须是plist类型的对象,或者换句话说,NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。

我最近做了类似的事情,其中​​包含这样的代码来存储项目:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:appSettings];
[prefs setObject:myEncodedObject forKey:@"appSettings"];
[prefs synchronize];

我的appSettings类要求我创建encodeWithCoder和initWithCoder方法,但是一旦我这样做,我就可以将该类放入用户默认值。