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
асинхронные запросы с обработчиками завершения и обработчиком завершения добавляют изображение в ваш массив!