Загрузка изображения из веб-службы в UIImage не работает должным образом

У меня есть productImageArray, который содержит URL как элементы массива. Я пытаюсь загрузить эти URL-адреса в своем представлении изображения.

Ниже приведен способ, как я его загружаю.

UIActivityIndicatorView *spinner=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
        spinner.center=CGPointMake(160.0,240.0 );
        spinner.hidesWhenStopped=YES;
        [self.view addSubview:spinner];
        [spinner startAnimating];

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
        dispatch_async(queue, ^{
             NSData *storeImageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:productImageArray[indexPath.row]]];
            self.productImage.image = [UIImage imageWithData:storeImageData];
            dispatch_sync(dispatch_get_main_queue(), ^{

                [spinner stopAnimating];
            });
        });

Проблема в том, что,

  1. Только последняя ячейка моего табличного представления загружает изображение, тогда как оставшаяся ячейка не загружает изображение из URL-адреса.
  2. Есть ли другой лучший способ загрузки изображения с URL-адреса непосредственно в мой UIImage с использованием собственных методов?

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

NSData *storeImageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:productImageArray[indexPath.row]]];

        self.productImage.image = [UIImage imageWithData:storeImageData];

person Community    schedule 07.05.2016    source источник
comment
поставить self.productImage.image = [UIImage imageWithData:storeImageData]; в основную очередь.   -  person Mahendra    schedule 07.05.2016
comment
если вы используете веб-сервис AFNetworking?   -  person Iyyappan Ravi    schedule 07.05.2016
comment
Нет, я не использую afnetworking   -  person    schedule 07.05.2016


Ответы (3)


попробуй это

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
    dispatch_async(queue, ^{
         NSData *storeImageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:productImageArray[indexPath.row]]];

        dispatch_sync(dispatch_get_main_queue(), ^{

            [spinner stopAnimating];
              self.productImage.image = [UIImage imageWithData:storeImageData];
        });
    });

или попробуй лайк

self.productImage.image = nil;   //// [UIImage imageNamed:@"default.png"];

 NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:productImageArray[indexPath.row]] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    if (data) {
        UIImage *currentImage = [UIImage imageWithData:data];
        if (currentImage) {
            dispatch_async(dispatch_get_main_queue(), ^{
                UITableviewCell *getCurrentCell = (id)[tableView cellForRowAtIndexPath:indexPath];
                if (getCurrentCell)
                     self.productImage.image = currentImage;
            });
        }
    }
}];
[task resume];
person Anbu.Karthik    schedule 07.05.2016
comment
да, я пробовал, но первая ячейка все еще не загрузила изображение, и оно все еще пустое - person ; 07.05.2016
comment
я пробовал, но это приводит к дублированию ячеек, а также несколько ячеек остаются незагруженными. - person ; 07.05.2016
comment
Вы можете изменить вопрос один раз - person Anbu.Karthik; 07.05.2016
comment
Есть всего две ячейки, но иногда отображаются 4 ячейки или 6 ячеек, а некоторые ячейки иногда выгружают изображение. - person ; 07.05.2016
comment
может быть размер вашего изображения большой, - person Anbu.Karthik; 07.05.2016

@ Anbu.Kartik ответ правильный.

Но, может быть, самое простое решение — использовать что-то вроде SDWebImage нет? Эта библиотека решит эту проблему и многое другое (кэш, управление ошибками, правильная обработка ячеек таблицы, ...).

Я думаю, вы должны хотя бы потратить несколько минут, чтобы просмотреть его: https://github.com/rs/SDWebImage

Изменить:

Если вы используете SDWebImage и UIActivityIndicator-for-SDWebImage, вы можете заменить весь код следующим образом:

   [self.productImage setImageWithURL:[NSURL URLWithString:productImageArray[indexPath.row]]
                      usingActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];

Дополнительная информация о UIActivityIndicator-for-SDWebImage: https://github.com/JJSaccolo/UIActivityIndicator-for-SDWebImage

person Julien Quere    schedule 07.05.2016
comment
Добро пожаловать, братан, если вы хотите получить самый простой ответ, используйте ответ onejjy, SDWebImage хорош для кеша - person Anbu.Karthik; 07.05.2016
comment
Я добавил пример, который полностью соответствует исходному коду. - person Julien Quere; 07.05.2016
comment
im getting No visible @interface for 'UIImageView' объявляет селектор 'setImageWithURL:usingActivityIndicatorStyle:' - person ; 07.05.2016
comment
Вы добавили 2 упомянутые библиотеки в свой проект? Вы его импортировали? - person Julien Quere; 07.05.2016

person    schedule
comment
да, но для его загрузки требуется время, и, следовательно, весь пользовательский интерфейс зависает - person ; 07.05.2016
comment
Я не думаю, что это хорошее решение. Действительно, вы загружаете изображение в основной поток. Таким образом, пользовательский интерфейс будет полностью заморожен во время всего процесса загрузки. - person Julien Quere; 07.05.2016
comment
Вы можете сделать это, используя sd_webimage [imgprofile sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@%@,[[[ResponseFriendList valueForKey:@data] objectAtIndex:indexPath.row] valueForKey:@profile_pic]]] placeholderImage:[UIImage imageNamed :@avatar.png]]; - person Bhikhu Vaja; 09.05.2016
comment
Пожалуйста, отредактируйте с дополнительной информацией. Только для кода и попробуйте эти ответы не рекомендуется, потому что они не содержат контента для поиска и не объясняют, почему кто-то должен попробовать это. Мы прилагаем усилия здесь, чтобы быть источником знаний. - person abarisone; 21.06.2016