Загрузить изображение асинхронно из файла - PullRequest
3 голосов
/ 18 октября 2010

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

[[UIImage alloc] initWithContentsOfFile:path];

для загрузки изображения.

Любые предложения / помощь, пожалуйста ....

Ответы [ 2 ]

5 голосов
/ 18 октября 2010

Если все, что вы пытаетесь сделать - это поддерживать поток пользовательского интерфейса, установите короткий метод для загрузки его в фоновом режиме и обновите imageView, когда это будет сделано:

-(void)backgroundLoadImageFromPath:(NSString*)path {
    UIImage *newImage = [UIImage imageWithContentsOfFile:path];
    [myImageView performSelectorOnMainThread:@selector(setImage:) withObject:newImage waitUntilDone:YES];
}

Это предполагает myImageViewявляется переменной-членом класса.Теперь просто запустите его в фоновом режиме из любого потока:

[self performSelectorInBackground:@selector(backgroundLoadImageFromPath:) withObject:path];

Обратите внимание, что в backgroundLoadImageFromPath вам нужно подождать, пока не закончится селектор setImage:, в противном случае пул автоматического выпуска фонового потока может освободить изображение до того, какметод setImage: может сохранить его.

0 голосов
/ 25 марта 2013

Вы можете использовать NSInvocationOperation для этой цели: Позвоните

NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc]
                                    initWithTarget:self
                                    selector:@selector(loadImage:)
                                    object:imagePath];
[queue addOperation:operation];

Где:

- (void)loadImage:(NSString *)path

{

NSData* imageFileData = [[NSData alloc] initWithContentsOfFile:path];
 UIImage* image = [[UIImage alloc] initWithData:imageFileData];

[self performSelectorOnMainThread:@selector(displayImage:) withObject:image waitUntilDone:NO];
}

- (void)displayImage:(UIImage *)image
{
    [imageView setImage:image]; //UIImageView
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...