从托管对象数据加载的UIImage不会显示在UIImageView中

时间:2014-09-30 16:11:07

标签: ios core-data uiimageview

我有一个非常简单的iOS应用程序(改编自基本的主要细节样板)。

我已经设置了RestKit来从服务器加载数据。如果对象的图像URL得到更新,我下载图像(使用AFHTTPClient子类)并使用UIImagePNGRepresentation(image)保存其数据。很简单。

现在,我已经有了一个已经填充了对象的数据库 - 包括他们的imageData。但出于某种原因,虽然我可以从数据中获得UIImage个实例,但UIImage中的UIImageView不会显示。{/ p>

我在自动生成的NSManagedObject子类上有一个类别,其中(除其他外)拉取图像数据,并返回UIImage个实例:

@implementation Artwork (Helpers)
// ...

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

@end

在我的详细视图中,我有一个UIImageView,其image是根据上述方法设置的。这是我的详细视图控制器中的相关位。它在segue之前被调用,并且可以正常设置描述文本,但不能正确设置图像。

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

NSLog来电打印:

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

所以它似乎确实存在UIImage对象并且已经从数据中解压缩就像它应该的那样。但是UIImageView中没有任何内容。

有趣的是,如果我在详细视图控制器上设置一个简单的触摸侦听器,我可以使用完全相同的代码显示图像:

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

效果很好 - 点按屏幕,图片立即显示,NSLog来电打印:

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

所以图像数据,并且 将其解压缩到正确的UIImage - 但它不会显示。

所以,总而言之,似乎存在某种时序或线程问题。但是我在这里画一个空白。

1 个答案:

答案 0 :(得分:0)

确保在主线程上设置图像:)

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