Подтвердить что ты не робот

Получение изображения из URL-адреса Цель C

Я пытаюсь получить изображение с 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, нуль, поэтому что-то там не работает.

4b9b3361

Ответ 1

Вы хотите получить данные изображения, а затем инициализировать 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];
});

Ответ 2

Хорошо, здесь здесь что-то не так:

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

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

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

Ответ 3

принятая асинхронная версия ответа работала очень медленно в моем коде. подход, использующий 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];
}

Ответ 4

В Swift 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