#swift #uicollectionview #uiimageview
Вопрос:
По какой-то причине массив в моем коде может предоставлять значения, хранящиеся в других позициях, но не в позициях 0 и 1, этот массив находится внутри цикла for, и я просто извлекаю изображения из Интернета и добавляю их в массив, но когда я загружаю эти изображения в представление коллекции, все остальные ячейки, кроме ячеек 0 и 1, отображают изображения с их индексными путями, соответствующими позициям массива, в подсчете массива показано, что общее количество отсчетов в массиве является ожидаемой суммой, но тогда он просто не получит значения, сохраненные в этих позициях.
class correctHomeViewController: UIViewController {
public var imgarrPic : [UIImage] = []
var imgarr = ["https://www.unsplash.com/photos/_3Q3tsJ01nc/download?force=true","https://www.unsplash.com/photos/dlxLGIy-2VU/download?force=true","https://www.unsplash.com/photos/TPUGbQmyVwE/download?force=true","https://unsplash.com/photos/9MRRM_hV4qA/download?force=true","https://unsplash.com/photos/HbAddptme1Q/download?force=true","https://unsplash.com/photos/wSct4rrBPWc/download?force=true","https://unsplash.com/photos/PKMvkg7vnUo/download?force=true"]
override func viewDidLoad() {
super.viewDidLoad()
loadImage()
}
func loadImage()
{
let config = URLSessionConfiguration.ephemeral
config.allowsCellularAccess = true
config.waitsForConnectivity = true
let sesh = URLSession(configuration: config)
for position in 0..<imgarr.count {
let url2 = URL(string: imgarr[position])
let data = sesh.dataTask(with: url2!) {data, _, error in
if data != nil amp;amp; error == nil {
let data3 = data!
let image = UIImage(data: data3)!
self.imgarrPic.append(image)
} else {
if error != nil || data == nil {
DispatchQueue.main.async {
self.view.showToast(toastMessage: error!.localizedDescription, duration: 5)
}
}
}
}
data.resume()
}
}
}
//displaying in the collection view
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "productCell2", for: indexPath) as! ProductsViewCell
DispatchQueue.main.async {
cell.cornerRadius()
if self.imgarrPic.count == self.imgarr.count {
cell.productImage.image = self.imgarrPic[indexPath.item]
} else {
cell.productImage.image = UIImage(named: "pwPic")
}
}
return cell
}
Комментарии:
1. Вы когда — нибудь слышали об асинхронном процессе?
2. Является ли это все еще асинхронным процессом, если он НИКОГДА не обновляется? Даже после 15 минут со стабильным интернетом?
3. ДА. Вы можете задать
timeoutInterval
значениеURLSession
.4. Я поместил индикатор в свой код, чтобы показать, сколько элементов было извлечено в массив после завершения цикла for, который urlsession не проходит, и он показывает количество, которое я ожидал, я хочу сказать, что я не думаю, что URLSession простаивает в какой-то момент, когда он полностью извлекает изображения, я просто не могу получить доступ к изображениям в позициях 0 и 1, как будто их не существует, что странно, потому что позиции 2 и 3 и так далее отображаются нормально
Ответ №1:
Гораздо более чистым подходом было бы использовать библиотеку, такую как Kingfisher, для загрузки изображений непосредственно в UICollectionView
делегат.
В этом случае вам не нужно загружать и хранить изображения в UIImage
массиве.
Вот код:
import Kingfisher
class correctHomeViewController: UIViewController
{
var imgarr = [
"https://www.unsplash.com/photos/_3Q3tsJ01nc/download?force=true",
"https://www.unsplash.com/photos/dlxLGIy-2VU/download?force=true",
"https://www.unsplash.com/photos/TPUGbQmyVwE/download?force=true",
"https://unsplash.com/photos/9MRRM_hV4qA/download?force=true",
"https://unsplash.com/photos/HbAddptme1Q/download?force=true",
"https://unsplash.com/photos/wSct4rrBPWc/download?force=true",
"https://unsplash.com/photos/PKMvkg7vnUo/download?force=true"
]
override func viewDidLoad() {
super.viewDidLoad()
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "productCell2", for: indexPath) as! ProductsViewCell
cell.cornerRadius()
let defaultImage = UIImage(named: "pwPic")
guard imgarr.count < indexPath.row, let imgUrl = URL(string: imgarr[indexPath.row]) else {
// Add default image
cell.productImage.image = defaultImage
return cell
}
// Add image from link using Kingfisher
cell.productImage.kf.setImage(with: imgUrl)
return cell
}