2017-09-27 52 views
0

我使用2网址像这样在collectionview显示2个图像的CollectionView图片...问题与显示通过URL的

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!) 
} 

图像现在正确显示。但我不显示这样的硬编码的时尚图片,我必须从显示的URL的我从我的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设置的位置做任何事情......?

+0

你可以使用https://github.com/rs/SDWebImage –

+0

好吧..但它基本上用于...什么? –

+0

@ User.bw请参阅此链接可能会有所帮助:https://stackoverflow.com/questions/46176409/loading-image-to-image-cell-from-url?answertab=oldest#tab-top –

回答

0

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

据苹果documentation

重要

不要使用此方法同步请求基于网络的网址。对于基于网络的URL,此方法可以在慢速网络上阻止当前线程几十秒,从而导致糟糕的用户体验,并且在iOS中可能会导致您的应用被终止。

相反,对于非文件URL,可以考虑使用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() 
      } 
     } 
    } 
+0

但除了糟糕的用户体验,它会导致图像无法完全显示在集合视图中...? –

+0

除此之外,图像应该正确显示。但使用这种方法,您将不会收到任何可能影响图像加载的网络状况的通知。如果他们没有出现,请检查您是否可以在浏览器中显示它们。您是否需要包含任何身份验证标头以便能够访问它们? –

+0

您是指在提出请求时要传递的参数..? –