Как узнать, когда UIimageView закончил загрузку? - PullRequest
2 голосов
/ 27 февраля 2011

В моем контроллере представления, как я могу знать, когда определенный UIImageView закончил загрузку (большой jpeg из каталога документов)? Мне нужно знать, чтобы потом я мог поменять местозаполнитель изображения низкого разрешения с этим изображением высокого разрешения. Нужно ли создавать собственный обратный вызов, чтобы знать это? Любой способ в порядке.

Кстати, вот фрагмент кода, куда я загружаю изображение:

NSString *fileName = [NSString stringWithFormat:@"hires_%i.jpg", currentPage];
NSString *filePath = [NSString stringWithFormat:@"%@/BookImage/%@", [self documentsDirectory], fileName];
hiResImageView.image = [[[UIImage alloc] initWithContentsOfFile:filePath] autorelease];

1 Ответ

2 голосов
/ 27 февраля 2011

UIImageView вообще не выполняет никакой загрузки.Вся загрузка выполняется [[UIImage alloc] initWithContentsOfFile:filePath], и ваш поток блокируется во время загрузки файла (поэтому загрузка уже завершена к моменту, когда вызов окончательно возвращается).

То, что вы хотите сделать, это нечтонапример:

- (void)loadImage:(NSString *)filePath {
    [self performSelectorInBackground:@selector(loadImageInBackground:) withObject:filePath];
}

- (void)loadImageInBackground:(NSString *)filePath {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:filePath];
    [self performSelectorOnMainThread:@selector(didLoadImageInBackground:) withObject:image waitUntilDone:YES];
    [image release];
    [pool release];
}

- (void)didLoadImageInBackground:(UIImage *)image {
    self.imageView.image = image;
}

Вы должны настроить self.imageView для отображения изображения в низком разрешении, а затем позвонить loadImage:, чтобы загрузить версию в высоком разрешении.

Обратите внимание, что если выВызывайте это повторно до того, как didLoadImageInBackground: будет вызван из более ранних вызовов, вы можете вызвать переполнение памяти устройства.Или, возможно, изображение из первого вызова загружается намного дольше, чем изображение из второго вызова, и didLoadImageInBackground: вызывается для второго изображения до того, как оно вызывается для первого.Решение этих проблем оставлено в качестве упражнения для читателя (или для другого вопроса).

...