每当用户点击我的应用中的某个标签页时,我都会尝试将用户列表(使用UIImage属性)保存到NSUserdefault。
在我的'user'对象中,我实现了编码,如下所示:
- (void)encodeWithCoder:(NSCoder *)encoder
{
NSURL *url = [NSURL URLWithString:self.avatar_url];
NSData *data = [NSData dataWithContentsOfURL:url];
self.avatar = [[[UIImage alloc] initWithData:data] autorelease];
[encoder encodeObject:UIImagePNGRepresentation(self.avatar) forKey:@"avatar"];
}
但是,我意识到通过这样做,我的应用程序在单击触发保存到NSUserdefault的选项卡后挂起。我将缓慢的性能归因于来自URL的UIImage的转换(和编码)。
有没有办法加快编码过程并将图像保存到NSUserdefault(这不会导致应用程序滞后)。
答案 0 :(得分:3)
它很慢的原因是因为你在图像下载之前阻塞了主线程。每当执行依赖网络活动的操作时,您应该将其移动到后台线程。正如@Richard J. Rosss III所指出的那样你可以直接保存数据,除非你绝对需要一个png并且原始格式不是png,否则没有理由转换为图像然后再转换为数据。
答案 1 :(得分:1)
如果URL是远程的(而不是本地file:///
URL),则性能问题可能是下载它 - 请查看使用NSURLRequest
和相关类来异步下载头像(在然后将其存储到NSUserDefaults
。
另请注意,将图像写入NSUserDefaults
并非预期用例 - 最好将其写入文档目录中的文件:
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"avatar"];
[data writeToFile:path atomically:YES];
获取:
NSData *data = [NSData dataWithContentsOfFile:path];
UIImage *image = [UIImage imageWithData:data];