我有一个非常简单的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
- 但它不会显示。
所以,总而言之,似乎存在某种时序或线程问题。但是我在这里画一个空白。
答案 0 :(得分:0)
确保在主线程上设置图像:)
dispatch_async(dispatch_get_main_queue(), ^(void) {
/* your code here */
});