我似乎无法访问存储在数组位置 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 中的值的主要内容,如果未能解决你的问题,请参考以下文章

将 UIWebView 访问保存到当前位置

创建sql表并读取json数组中的值

如何在 Objective-C 中显示存储在数组中的值

数组中的元素的索引 是数组下标 还是数组的值

一种在数组中的两个索引之间交换位置的方法[重复]

main() 打印出与paint() 不同的多维数组的值