iPhone: Как получить UIImage из URL? - PullRequest
15 голосов
/ 19 ноября 2009

Как загрузить изображение и превратить его в UIImage?

Ответы [ 7 ]

39 голосов
/ 19 ноября 2009
NSURL *url = [NSURL URLWithString:@"http://example.com/image.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *img = [[[UIImage alloc] initWithData:data] autorelease];

Однако, это не асинхронно.

15 голосов
/ 19 ноября 2009

Следует помнить, что загрузка данных изображения с примером кода, который вы указали в своем собственном ответе, будет блокировать основной поток до завершения загрузки. Это удобство использования нет-нет. Пользователи вашего приложения будут думать, что ваше приложение не отвечает. Если вы хотите загрузить изображение, предпочтите NSURLConnection, чтобы загрузить его асинхронно в своем собственном потоке.

Прочитайте документацию Apple по асинхронным загрузкам с NSURLConnection.

Когда загрузка завершится, вы можете создать экземпляр UIImage из объекта данных:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    if (requestData)
    {
        self.image = [[[UIImage alloc] initWithData:requestData] autorelease];
    }
}

Где requestData и image - переменные экземпляра вашего содержащего класса, а image - сохраненное свойство. Обязательно выпустите image в подпрограмме dealloc класса, например используя self.image=nil;.

5 голосов
/ 12 декабря 2011

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

[self performSelectorInBackground:@selector(loadImage) withObject:nil];

- (void)loadImage
{
   NSURL * url = [NSURL URLWithString:@"http://.../....jpg"];
   NSData * data = [NSData dataWithContentsOfURL:url];
   UIImage * image = [UIImage imageWithData:data];
   if (image)
   {
       // Success use the image
       ...
   }
   else
   {
       // Failed (load an error image?)
       ...
   }
}   
3 голосов
/ 05 апреля 2016

Вы можете загрузить изображение в UIImageView с URL-адреса, не блокируя поток пользовательского интерфейса, просто используя dispatch_async:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSURL *url = [NSURL URLWithString:myURL];
            NSData *data = [NSData dataWithContentsOfURL:url];
            UIImage* image = [[UIImage alloc]initWithData:data];

            dispatch_async(dispatch_get_main_queue(), ^{
                [myImageView setImage:image];
            });
        });

Первый dispatch_async используется для загрузки изображения с URL-адреса в фоновом режиме (без блокировки пользовательского интерфейса). Второй dispatch_async используется для фактического введения изображения, только что загруженного в UIImageView. Обратите внимание, что второй dispatch_async предназначен для работы в основном потоке (потоке пользовательского интерфейса), который действительно является потоком, используемым для обновления пользовательского интерфейса.

2 голосов
/ 09 февраля 2012
1 голос
/ 24 июля 2015

Основываясь на ответе @ philfreo, я создал расширение NSURL в swift, используя BrightFutures (для асинхронного обратного вызова:

extension NSURL{
    func downloadImage() -> Future<UIImage, NSError>{

        let promise = Promise<UIImage, NSError>()

        Queue.global.async{
            if let data = NSData(contentsOfURL: self){
                if let image = UIImage(data: data){
                    promise.success(image)
                    return
                }
            }
            promise.failure(NSError())
        }

        return promise.future
    }
}

Это позволяет мне сделать:

import BrightFutures

let someURL = ...;
someURL.downloadImage().onSuccess{ image in
  // Do something with the UIImage
}

Обновление

Простое синхронное расширение может выглядеть так:

extension NSURL{
    func downloadImage() -> UIImage?{
        if let data = NSData(contentsOfURL: self){
            return UIImage(data: data){
        }
    return nil
    }
}
0 голосов
/ 31 августа 2015

Вот как ответ @ philfreo выглядит быстро:

let urlString = "http://lorempixel.com/100/100/cats/"
let url = NSURL(string: urlString)!
let data = NSData(contentsOfURL: url)
let image = UIImage(data: data!)

Это работает на детской площадке:

image

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