ios awkard image loading (url to nsdata to uiimage to uiimageview)

女生的网名这么多〃 提交于 2019-12-13 00:12:53

问题


I need you to humor me during this question. This is somewhat pseudo code because the actual situation is quite complex. I wouldn't load an image this way unless I needed to. Assume that I need to.

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

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

[self.anIBOutletOfUIImageView setImage:img];

but I crash out with

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

How can I load an image from a URL into NSData and then load that NSData into a UIImage and set that UIImage as the image for my UIImageView?

Again, I realize this sounds like nonsense, but due to an image caching system I'm using I have to do things this way :(


回答1:


I plugged this code into a new, iPad "Single view application" template:

- (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];
}

I got the image to load up properly. I even tried different content modes for the UIImageView, and they all worked as expected.

If you start from scratch, do you get the same problem?

The error message indicates that you're sending a message of "_isResizable" to an NSData object. Maybe you're inadvertently setting the UIImageView's image property equal to the NSData instead of the UIImage.

Edit/Update

I even went back and tried different versions of "one-lining" the code to see if any of that mattered, since my "working" copy was slightly altered from your non-working copy. I couldn't get the code to break. My guess would be that the code in question isn't broken, but something nearby is...




回答2:


How I usually handle this situation (not compiled, not tested):

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

}];

This avoids the long-running network request implied by the call to dataWithContentsOfURL:, so your app can continue doing things on the main thread while the data downloads for the image.

As a side note, you seem to be running into the same error as this question; you might want to check that you're not running into object allocation problems.



来源:https://stackoverflow.com/questions/10473673/ios-awkard-image-loading-url-to-nsdata-to-uiimage-to-uiimageview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!