我似乎无法访问存储在数组位置 0 和 1 中的值
Posted
技术标签:
【中文标题】我似乎无法访问存储在数组位置 0 和 1 中的值【英文标题】:I cannot seem to access values stored in the position 0 and 1 of array 【发布时间】:2021-08-30 04:56:49 【问题描述】:由于某种原因,我的代码中的数组可以提供存储在其他位置但不能存储在位置 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 && 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
【问题讨论】:
你听说过异步进程吗? 如果它从不自我更新,它仍然是一个异步过程吗?即使在 15 分钟后网络稳定? 是的。您可以将timeoutInterval
值设置为URLSession
。
我在我的代码中放置了一个指示器,以显示在 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
【讨论】:
以上是关于我似乎无法访问存储在数组位置 0 和 1 中的值的主要内容,如果未能解决你的问题,请参考以下文章