У меня есть 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?

0
tresnotas 9 Апр 2011 в 16:24

1 ответ

Кажется, loadView завершается до завершения загрузки изображения. Вам нужен какой-то способ вызова [imageView setNeedsDisplay], когда загрузка изображения завершена. Вам нужен некоторый метод, который вызывается при загрузке изображения, который обращается к imageView (возможно, с помощью viewWithTag) из scrollView и вызывает [imageView setNeedsDisplay];

0
jamihash 9 Апр 2011 в 17:14
Спасибо, это имеет смысл, хотя я не уверен, как именно это реализовать. С другой стороны, я просто поместил оператор NSLog в свою функцию, и он печатает 8 раз, также понял, что любые операторы печати в loadView также печатают 8 раз. Я не думаю, что это нормально, я чувствую, что происходят перезванивания туда и обратно или что-то в этом роде.
 – 
tresnotas
9 Апр 2011 в 17:34