SDWebImage дает ноль с URL

У меня есть строка, в которой я разделил запятыми ссылки на изображения. Вот как я делю его на массив: let imagesLinks = imageLins.components(separatedBy: ","), Затем я использовал для цикла, чтобы получить одну ссылку, загрузить изображение и сохранить его в UIImage массив таким образом:

for imag in imagesLinks
        {
            let img = UIImageView()

            print("\(baseReportImageURL)\(imag)")

            img.sd_setImage(with: URL(string: "\(baseReportImageURL)\(imag)"), placeholderImage: nil)
            imagesArray.append(img.image!)
        }

Оператор print дает мне правильный URL, который, когда я открываю браузер, загружает изображение. Проблема в том, где я добавляю массив, т.е. imagesArray.append(img.image!), Я получил:

фатальная ошибка: неожиданно найден ноль при развертывании необязательного значения

а также

фатальная ошибка: неожиданно найден ноль при развертывании необязательного значения

Так что будет правильным решением для этого?

ОБНОВИТЬ

Мой вопрос другой, потому что я использую SDWebImage и когда я использую блок завершения, происходит странное поведение приложения:

img.sd_setImage(with: imgURL, placeholderImage: nil,options: SDWebImageOptions(rawValue: 0), completed: { (image, error, cacheType, imageURL) in
                activityIndicator.stopAnimating()
                imagesArray.append(image!)
                self.photoCollection.reloadData()
            })

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

4 ответа

Я думаю, что это не правильный способ получения загруженных изображений (установите изображения для UIImageView, а затем получите изображения оттуда).

Вы должны использовать загрузчик изображений, предоставляемый SDWebImage:

SDWebImageManager.shared().imageDownloader?.downloadImage(with: <YOUR_URL>, options: [], progress: { (received, expected, nil) in
            print(received,expected)
        }, completed: { (image, data, error, true) in
            yourArray.append(image)
        })

Если у вас есть индексы, вы можете обновить текущую строку в tableview каждый раз, когда изображение загружается, или просто reload() в целом, но я рекомендую первое.

Добавьте изображение в массив изображений в sd_setImage Завершение блока. Изображение еще не загружено, когда вы пытаетесь добавить его в массив, и проверьте, что изображение не равно нулю, прежде чем добавить его.

Используйте этот блок для загрузки изображений. После загрузки выполните операцию (добавьте изображение)

cell.appIcon.sd_setImage(with: url!, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed: { (image, error, cacheType, imageURL) in
 // Perform operation.
//append Image Here
}) 

Это потому что

  imagesArray.append(img.image!)

Изображение берут несколько раз для скачивания. Когда вы делаете imagesArray.append(img.image!) в это время возможно, что ваше изображение не настроено на ваше изображение, и это означает, что вы пытаетесь добавить nil в вашем imageArray!

Второе, почему вы храните изображение в массиве? У вас есть массив urls и вы используете SDWebImage тогда каждый раз, когда вы хотите отобразить использование изображения SDWebImage, Нет необходимости хранить в массиве!

И если вы хотите изображения в массиве в любом случае, чем использовать NSUrlSession асинхронные запросы с обработчиками завершения и обработчиком завершения добавляют изображение в ваш массив!

Другие вопросы по тегам