通过URL在collectionview中显示图像的问题

时间:2017-09-27 11:05:01

标签: ios swift uicollectionview

我在collectionview中使用2个网址显示2张图片,如此...

var sampleURLArray: [NSURL] = []

sampleURLArray = [NSURL(string: "http://myApp.abc.com/products/123_45_6_image_123456")!,NSURL(string: "http://myApp.abc.com/products/789_45_6_image_654321")!]

我正在迭代URL并将图像分配给一个像这样的数组......

    for imageNumber in self.sampleURLArray {

        let imageurl1 = imageNumber
        let url = imageurl1

        let data = try? Data(contentsOf: url as URL)
        self.sampleImageView.image = UIImage(data: data!)
        self.arrayOfURLImages.append(self.sampleImageView.image!)
 }

现在可以正确显示图像。但我不是以这种硬编码的方式显示图像,而是我必须从我正在做的json响应中显示来自网址的图像...

      if let projectData = result["Productdata"] as? [[String:Any]] {

     let productIds = projectData.flatMap({ $0["product_id"] as? String })
     let images = projectData.flatMap({ $0["product_images"] as? [[String: Any]] }).flatMap({ $0 })
     let imageIds = images.flatMap({ $0["image"] as? String })

    self.appDelegate.commonArrForCollectionViewImgs = imageIds //I'll get each URL from self.appDelegate.commonArrForCollectionViewImgs

         }
//CommonArrForCollectionViewImgs is set as  var commonArrForCollectionViewImgs = [String]()  
       for imageNumber in self.appDelegate.commonArrForCollectionViewImgs {

       let imageurl1 = imageNumber
       let url = URL(string: imageurl1)
       print(url)
       if let dataOfUrl = try? Data(contentsOf: url!) {
       let data = dataOfUrl
       self.sampleImageView.image = UIImage(data: data)
      }

       self.arrayOfURLImages.append(self.sampleImageView.image!)


     }

但是当这样做时,图像不会显示在collectionview中,但我可以正确地解析所有网址。另外,如果我在API请求中获得成功,我正在进行json解析。我无法弄清问题是什么。这是否必须对collectionview的设置位置做任何事情......?

1 个答案:

答案 0 :(得分:0)

据我所知,您正在使用Data(contentsOf: url!)初始化程序来获取远程资源。此方法仅用于本地资源。不要误解URL部分。 URL也可以指向本地资源。

根据Apple documentation

  

重要

     

请勿使用此同步方法来请求基于网络的网址。对于基于网络的URL,此方法可以在慢速网络上阻止当前线程持续数十秒,从而导致用户体验不佳,而在iOS中,可能会导致应用程序被终止。

     

相反,对于非文件网址,请考虑使用    NSURLSession 类的dataTask(with:completionHandler:)方法。有关详细信息,请参阅URL Session Programming Guide

但是,如果你真的想使用这种方法,你可以像这样获取你的资源。

    DispatchQueue.global(qos: .background).async
    {
        for url in urls {
            let data = try? Data(contentsOf: url!)
            self.images.append(UIImage(data: data!)!)

            DispatchQueue.main.async {
                self.collectionView.reloadData()
            }
        }
    }