Как прочитать изображение с диска и заблокировать его до тех пор, пока оно не будет прочитано? - PullRequest
3 голосов
/ 14 апреля 2010

Я загружаю 5 изображений с диска, но я хочу, чтобы первое прочитанное изображение появилось как можно скорее. Прямо сейчас я делаю

UIImage *img = [UIImage imageWithContentsOfFile:path];

в цикле for, но поскольку imageWithContentsOfFile: путь не блокирует все 5 изображений, которые считываются с диска до того, как появится первое (потому что все они используют ввод / вывод). Я подтвердил это, просто загрузив один, и он появился на экране быстрее, чем если бы я загрузил все 5.

Я хотел бы загрузить 1-е изображение и блок до его полного чтения и показа перед загрузкой следующих 4 или загрузки 1-го и получать уведомление, когда это будет сделано до загрузки следующих 4, но я могу не найти способ сделать это. Ни один из методов WithContentsOfFile для блока данных или изображения, и они не уведомляют или не имеют методов делегата. Есть предложения?

Спасибо

Ответы [ 3 ]

4 голосов
/ 15 апреля 2010

Чтобы убедиться, что изображение полностью загружено с диска, сначала загрузите файл изображения в объект NSData, а затем инициализируйте изображение с данными:

NSError *err = nil;
NSData *data [NSData dataWithContentsOfFile:path 
                                    options:NSDataReadingUncached
                                      error:&err];
UIImage *img = [UIImage imageWithData:data];

Клаус

0 голосов
/ 14 апреля 2010

AFAICS нет способа гарантировать, что данные изображения находятся в памяти. В документации на initWithContentsOfFile написано, что

Этот метод загружает данные изображения в память и помечает его как очищаемый. Если данные очищены и должны быть перезагрузка, объект изображения загружается, что данные снова по указанному пути

Таким образом, ОС может в любой момент освободить память и заставить ваше приложение снова загрузить изображение из файла. Тем не менее, я думаю, что вы можете попытаться сделать несколько трюков, таких как вызов метода, который требует реальных данных. Вы можете начать с вызова size возвращенного изображения. Я не уверен, что size действительно нужны все данные изображения и не кэшируется. Возможно, вам придется вызывать что-то другое для нижележащих методов CGImageRef. Что-то вроде CGImageGetBytesPerRow может помочь. Но я бы сначала начал с size

0 голосов
/ 14 апреля 2010

Вы хотите загрузить изображение в фоновом режиме, а затем перезвонить, когда загрузка будет завершена, чтобы вы могли отобразить его ... таким образом, блок чтения изображений не повлияет на вас, и вы сможете отображать изображения, пока загружаются другие или делай что хочешь .. что-то вроде

-(void) getMyImage:(NSString*)path
then 
[self performSelectorInBackground:@selector(getMyImage) withObject:path];

you can also have a methods
-(void)didFinishLoadingImage:(UIImage*)image// which gets called in getMyImage when  the image is done loading...something like
[self performMethodInMainThread:@selector(didFinishloadingImage:)] etc...

Вы можете использовать это для загрузки изображений как вам угодно ... вы можете передавать туда дополнительные переменные, чтобы вы могли знать, какое изображение вы загружаете, или придумать что-то для отслеживания, но использование чего-то подобного должно чтобы решить вашу проблему ...

надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...