首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以异步UIImageJPEGRepresentation writeToFile吗?

我可以异步UIImageJPEGRepresentation writeToFile吗?
EN

Stack Overflow用户
提问于 2014-02-10 07:47:54
回答 2查看 1.7K关注 0票数 1

当我从服务器获得图像时,我正在执行以下操作。但这段代码让我的应用程序崩溃了。它冻结了UI。

这能在iOS中的后台线程上运行吗?我可以使用异步吗?

代码语言:javascript
复制
 if (![NSString isEmpty:user.avatarURL])
 {
     NSString *pathToImage = user.avatarURL;
     NSURL *url = [NSURL URLWithString:pathToImage];
     NSData *data = [NSData dataWithContentsOfURL:url];
     UIImage *image = [[UIImage alloc] initWithData:data];

     [[NSUserDefaults standardUserDefaults] setObject:UIImageJPEGRepresentation(image, 1) forKey:kUserImage];

     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,                                                                                             NSUserDomainMask, YES);
     NSString *documentsDirectory = [paths objectAtIndex:0];
     NSString* path = [documentsDirectory stringByAppendingPathComponent:@"userAvatar.png" ];
     NSData* jpegdata = UIImageJPEGRepresentation(image, 1);
     [jpegdata writeToFile:path atomically:YES];                                           
 }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-10 08:32:15

正如@valentin所说,您可以在dispatch_async()调用的if()语句中执行所有操作。

注意,我怀疑放慢速度的可能是-dataWithContentsOfURL:,而不是UIImageJPEGRepresentation(),所以您需要确保这是在您的dispatch_async中,而不是在外部。

另外,我不清楚你为什么要将数据解压缩成图像,然后再压缩它。你会得到这样做的工件,而且大多数服务的化身图像都会被压缩。

我会做以下几件事:

代码语言:javascript
复制
if (user.avatarURL) 
    dispatch_async(dispatch_get_main_queue(), ^{
        NSURL *const imageURL = [NSURL URLWithString:user.avatarURL];
        if (!imageURL)
            return;
        NSData *const imageDdata = [NSData dataWithContentsOfURL:imageURL];
        if (!imageDdata.length)
            return;

        [[NSUserDefaults standardUserDefaults] setObject:imageDdata forKey:kUserImage];

        [imageDdata writeToFile:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"userAvatar.png"] atomically:YES];                                           
    });
票数 3
EN

Stack Overflow用户

发布于 2014-02-10 08:28:56

造成最大损害的线是:

代码语言:javascript
复制
 NSData *data = [NSData dataWithContentsOfURL:url];

因为它是从网络下载的。代码中的任何内容都不会更新UI,因此所有这些都可以在后台线程上运行。只需确保如果在保存图像后发布通知或随后更新UI,则切换回主线程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21671596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档