尝试编码UIImage并存储到NSUserdefault时App会变慢

时间:2011-11-02 15:21:10

标签: objective-c ios url encoding uiimage

每当用户点击我的应用中的某个标签页时,我都会尝试将用户列表(使用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(这不会导致应用程序滞后)。

2 个答案:

答案 0 :(得分:3)

它很慢的原因是因为你在图像下载之前阻塞了主线程。每当执行依赖网络活动的操作时,您应该将其移动到后台线程。正如@Richard J. Rosss III所指出的那样你可以直接保存数据,除非你绝对需要一个png并且原始格式不是png,否则没有理由转换为图像然后再转换为数据。

Concurrency Programming Guide

答案 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];