ios awkard图像加载(url到nsdata到uiimage到uiimageview)

时间:2012-05-06 19:43:30

标签: ios uiimageview uiimage nsdata nsurl

在这个问题上,我需要你来幽默我。这有点伪代码,因为实际情况非常复杂。除非我需要,否则我不会以这种方式加载图像。假设我需要。

NSURL *bgImageURL = [NSURL URLWithString:@"https://www.google.com/images/srpr/logo3w.png"];

UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:bgImageURL]];

[self.anIBOutletOfUIImageView setImage:img];

但我崩溃了

-[__NSCFData _isResizable]: unrecognized selector sent to instance 0x9508c70

如何将URL中的图像加载到NSData中,然后将该NSData加载到UIImage中,并将UIImage设置为UIImageView的图像?

再次,我意识到这听起来像废话,但由于我使用的图像缓存系统,我必须这样做:(

2 个答案:

答案 0 :(得分:5)

我通常如何处理这种情况(未编译,未经测试):

NSURL * url = [NSURL URLWithString:@"https://www.google.com/images/srpr/logo3w.png"];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue currentQueue]
                       completionHandler:^(NSURLResponse * resp, NSData * data, NSError * error) {

    // No error handling - check `error` if you want to
    UIImage * img = [UIImage imageWithData:data];
    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:img waitUntilDone:YES];

}];

这可以避免调用dataWithContentsOfURL:所暗示的长时间运行的网络请求,因此您的应用可以在数据下载图像时继续在主线程上执行操作。

作为旁注,您似乎遇到了与this question相同的错误;你可能想检查一下你是否遇到了对象分配问题。

答案 1 :(得分:1)

我将此代码插入到新的iPad“单一视图应用程序”模板中:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSURL *bgImageURL = [NSURL URLWithString:@"https://www.google.com/images/srpr/logo3w.png"];
    NSData *bgImageData = [NSData dataWithContentsOfURL:bgImageURL];
    UIImage *img = [UIImage imageWithData:bgImageData];
    [[self Imageview] setImage:img];
}

我让图像正确加载。我甚至为UIImageView尝试了不同的内容模式,它们都按预期工作。

如果你从头开始,你会遇到同样的问题吗?

错误消息表明您正在向NSData对象发送“_isResizable”消息。也许您无意中将UIImageView的{​​{1}}属性设置为image而不是NSData

修改/更新

我甚至回去尝试了不同版本的“单行”代码,看看是否有任何重要的,因为我的“工作”副本稍微改变了你的非工作副本。我无法让代码破解。我的猜测是有问题的代码没有被破坏,但附近的东西是......