Получение изображения с URL Цель C - PullRequest
49 голосов
/ 01 июня 2009

Я пытаюсь получить изображение из URL, и оно, похоже, не работает для меня. Может ли кто-нибудь указать мне правильное направление?

Вот мой код:

NSURL *url = [NSURL URLWithString:@"http://myurl/mypic.jpg"];

NSString *newIMAGE = [[NSString alloc] initWithContentsOfURL:url
                                       encoding:NSUTF8StringEncoding error:nil];

cell.image = [UIImage imageNamed:newIMAGE];

Когда я отлаживаю, строка newIMAGE равна nil, поэтому что-то там не работает.

Ответы [ 5 ]

162 голосов
/ 01 июня 2009

Вы хотите получить данные изображения, а затем инициализировать UIImage, используя эти данные:

NSData * imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: @"http://myurl/mypic.jpg"]];
cell.image = [UIImage imageWithData: imageData];
[imageData release];

По запросу, вот асинхронная версия:

dispatch_async(dispatch_get_global_queue(0,0), ^{
    NSData * data = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: @"http://myurl/mypic.jpg"]];
    if ( data == nil )
        return;
    dispatch_async(dispatch_get_main_queue(), ^{
        // WARNING: is the cell still using the same data by this point??
        cell.image = [UIImage imageWithData: data];
    });
    [data release];
});
4 голосов
/ 01 июня 2009

Хорошо, здесь пара вещей не так:

  1. Преобразование из URL (url) в NSString (newImage) является неправильным, в действительности код выполняет попытку загрузки содержимого "http://myurl/mypic.jpg" в NSString.

  2. Метод -imageNamed принимает в качестве аргумента строку, представляющую собой путь к локальному файлу, а не URL.

Вам необходимо использовать объект NSData в качестве посредника, как в этом примере: http://blogs.oreilly.com/digitalmedia/2008/02/creating-an-uiimage-from-a-url.html

3 голосов
/ 26 марта 2015

принятый ответ асинхронная версия работала очень медленно в моем коде. подход, использующий NSOperation, работал световыми годами быстрее. код, предоставленный Джо Масилотти -> цель - C: загрузка изображения с URL? (и вставлено ниже):

-(void) someMethod {
    // set placeholder image
    UIImage* memberPhoto = [UIImage imageNamed:@"place_holder_image.png"];

    // retrieve image for cell in using NSOperation
    NSURL *url = [NSURL URLWithString:group.photo_link[indexPath.row]];
    [self loadImage:url];
}

- (void)loadImage:(NSURL *)imageURL
{
    NSOperationQueue *queue = [NSOperationQueue new];
    NSInvocationOperation *operation = [[NSInvocationOperation alloc]
                                        initWithTarget:self
                                        selector:@selector(requestRemoteImage:)
                                        object:imageURL];
    [queue addOperation:operation];
}

- (void)requestRemoteImage:(NSURL *)imageURL
{
    NSData *imageData = [[NSData alloc] initWithContentsOfURL:imageURL];
    UIImage *image = [[UIImage alloc] initWithData:imageData];

    [self performSelectorOnMainThread:@selector(placeImageInUI:) withObject:image waitUntilDone:YES];
}

- (void)placeImageInUI:(UIImage *)image
{
    [self.memberPhotoImage setImage:image];
}
1 голос
/ 26 сентября 2018

Обновление после ответа Джима Дейви, [data release] больше не требуется, поскольку в обновленных правилах Apple. Управление памятью осуществляется автоматически с помощью ARC (ссылка на автоматический подсчет),

Вот обновленный asynchronous call,

dispatch_async(dispatch_get_global_queue(0,0), ^{
        NSData * data = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: @"your_URL"]];
        if ( data == nil )
            return;
        dispatch_async(dispatch_get_main_queue(), ^{
            self.your_UIimage.image = [UIImage imageWithData: data];
        });

    });
0 голосов
/ 11 июня 2017

В Свифт 3 и 4

let theURL = URL(string:"https://exampleURL.com")
let imagedData = NSData(contentsOf: theURL!)!
let theImage = UIImage(data: imagedData as Data)
cell.theImageView.image = theImage

Это будет сделано в главном потоке.

И выполнить тоже самое в асинхронном / фоновом потоке

   DispatchQueue.main.async(){
      let theURL = URL(string:"https://exampleURL.com")
      let imagedData = NSData(contentsOf: theURL!)!
      let theImage = UIImage(data: imagedData as Data)
   }
   cell.theImageView.image = theImage
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...