简体   繁体   中英

UIImage loaded from managed object data doesn't show up in UIImageView

I've got a pretty simple iOS app (adapted from basic master-detail boilerplate).

I've got RestKit set up to load data from a server. If an object's image URL gets updated, I download the image (using an AFHTTPClient subclass) and save its data using UIImagePNGRepresentation(image) . Pretty straightforward.

So now, I've got a database that's already populated with objects - including their imageData . But for some reason, though I can get a UIImage instance from the data, that UIImage won't show up in a UIImageView .

I've got a category on the auto-generated NSManagedObject subclass, which (among other things) pulls the image data, and returns a UIImage instance:

@implementation Artwork (Helpers)
// ...

- (UIImage*)image {
    if (self.imageData) {
        return [UIImage imageWithData:self.imageData];
    }
    return nil;
}

@end

In my detail view, I have a UIImageView , whose image is set from the above method. Here's the relevant bit from my detail view controller. It gets called just before the segue, and works fine for setting the description text, but doesn't set the image correctly.

- (void)configureView {
    // Update the user interface for the detail item (a Artwork instance in this case).
    if (self.detailItem) {
        // this works just fine
        self.detailDescriptionText.text = self.detailItem.rawDescription;

        // ... but this doesn't! Nothing is shown in the 
        UIImage *image = self.detailItem.image;
        if (image) {
            // Yes, the UIImage *is* there
            NSLog(@"UIImage instance: %@, size: %fx%f", image, image.size.width, image.size.height);
            // ... but this doesn't seem to any effect
            self.imageView.image = image;
        }
    }
}

The NSLog call prints:

UIImage instance: <UIImage: 0x109a0d090>, size: 533.000000x300.000000

so it certainly seems like the UIImage object exists and has been unpacked from the data just like it should. But nothing shows up in the UIImageView .

Interestingly, if I set up a simple touch-listener on the detail view controller, I can show the image using the exact same code:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UIImage *image = self.detailItem.image;
    if (image) {
        NSLog(@"UIImage instance: %@, size: %fx%f", image, image.size.width, image.size.height);
        self.imageView.image = image;
    }
}

That works perfectly - tap the screen and the image shows up immediately, and the NSLog call prints:

UIImage instance: <UIImage: 0x10980a7e0>, size: 533.000000x300.000000

So there really is image data, and it does get unpacked into a proper UIImage - but it won't show up.

So, all in all, it seems like there's some sort of timing or threading issue. But here I'm drawing a blank.

Make sure to set your image on the main thread :)

dispatch_async(dispatch_get_main_queue(), ^(void) {
    /* your code here */
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM