我有一个UIScrollViewController,它有一个UIScrollView,里面有一个UIImageView。 在滚动视图控制器的loadView中,我通过调用一个函数来下载图像,该函数应该在另一个线程上进行下载。我从loadView中调用此函数,然后将imageview放在scrollview中,并将scrollview设置为控制器的视图。
问题是我在运行程序时看不到图像,单击tableView中的一行(它应该按下滚动视图中的图像)。但是,如果我更改tabss(在tabbarviewcontroller中)并返回此选项卡。图像将显示。
所以我认为图像下载发生了,但我在屏幕上立即显示它有问题。它只在我回到它之后出现。我似乎做错了什么?我是线程的新手,所以我怀疑这是一个问题。另外我的代码在我创建之前就已经开始工作,以便它可以在另一个线程中进行下载,所以我很确定它与此相关。
这是Photo.m中的函数,它是核心数据中的实体。这应该是下载
- (void)processImageDataWithBlock:(void (^)(NSData *imageData))processImage {
NSString *url = self.imageURL;
dispatch_queue_t callerQueue = dispatch_get_current_queue();
dispatch_queue_t downloadQueue = dispatch_queue_create("Flickr download", NULL);
dispatch_async(downloadQueue, ^{
NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:url];
dispatch_async(callerQueue, ^{
processImage(imageData);
});
});
}
这是我在PhotoScrollViewController.m中的loadView方法
- (void)loadView {
[image processImageDataWithBlock:^(NSData *imageData) {
UIImage *imageToBeShown = [UIImage imageWithData:imageData];
imageView = [[UIImageView alloc] initWithImage:imageToBeShown];
CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
scrollView = [[UIScrollView alloc] initWithFrame:applicationFrame];
scrollView.delegate = self;
scrollView.contentSize = imageToBeShown.size;
[scrollView addSubview:imageView];
self.title = image.title;
self.view = scrollView;
}];
}
已修改以添加作为答案添加的额外信息
将[super loadView]添加到我的loadView方法解决了这个问题。但是,文档说我不应该从我的loadView调用super loadView。
我尝试将代码移动到viewDidLoad,这也是有效的。但实际上这是设置视图的代码,所以我觉得我应该把它放在loadView中。但是当我使用这种多线程机制下载时,它不起作用。
这是因为下载在某种程度上干扰了我在loadView中设置视图吗?
答案 0 :(得分:0)
在图像下载完成之前,似乎loadView已完成。图像下载完成后,您需要一些调用[imageView setNeedsDisplay]的方法。您需要一些在完成图像下载时调用的方法,该方法从scrollView访问imageView(可能使用viewWithTag)并调用[imageView setNeedsDisplay];