У меня есть UIScrollViewController с UIScrollView, внутри которого находится UIImageView. В loadView контроллера просмотра прокрутки я загружаю изображение, вызывая функцию, которая должна выполнять загрузку в другом потоке. Я вызываю эту функцию из своего loadView, а затем помещаю изображение в прокрутку и устанавливаю прокрутку в качестве представления контроллера.
Проблема в том, что я не вижу изображение, когда запускаю программу, после нажатия строки в 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);
});
});
}
Это мой метод loadView в PhotoScrollViewController.m.
- (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 решило проблему. Однако в документации сказано, что мне не следует вызывать super loadView из моего loadView.
Я попытался переместить код в viewDidLoad, и это тоже работает. Но на самом деле это код, который устанавливает представление, поэтому я чувствую, что должен поместить его в loadView. Но тогда это не работает, когда я использую этот многопоточный механизм для загрузки.
Это потому, что загрузка как-то мешает мне настроить представление в loadView?
1 ответ
Кажется, loadView завершается до завершения загрузки изображения. Вам нужен какой-то способ вызова [imageView setNeedsDisplay], когда загрузка изображения завершена. Вам нужен некоторый метод, который вызывается при загрузке изображения, который обращается к imageView (возможно, с помощью viewWithTag) из scrollView и вызывает [imageView setNeedsDisplay];
Похожие вопросы
Новые вопросы
iphone
НЕ ИСПОЛЬЗУЙТЕ этот тег, если вы не обращаетесь конкретно к iPhone и / или iPod touch от Apple. Для вопросов, не зависящих от оборудования, используйте тег [ios]. Больше тегов, которые нужно рассмотреть, это [xcode] (но только если вопрос касается самой IDE), [swift], [target-c] или [cocoa-touch] (но не [cocoa]). Пожалуйста, воздержитесь от вопросов, касающихся iTunes App Store или iTunes Connect. Если вы используете C #, пометьте [mono].