如何在 collectionView 中显示来自 API in swift 的 s3 图像

How to display s3 image in collectionView get from API in swift

我是 Swift 的新手。现在,我正在开发一个应用程序,它将从 API 获取数据并显示在 Swift 中。我在后端将 s3 中的图像存储为 public,并通过使用 API 作为 link 传递给 Swift,例如https://example.com/20210501210101.png。我在网上对这个主题做了很多研究,但我找不到合适的方式来显示我的图像。有什么方法可以在 Swift 中显示通过 link 从 s3 获取的图像?

消息经过API

{
   "success": true,
   "message": "Successfully retrieved image",
   "image_detail": [
       {
           "image": "https://example.com/20210501212429.png",
       }
   ]
}

我正在使用 collectionview 显示我的图像,下面是我的代码示例

extension LandingPageViewController: UICollectionViewDelegate, UICollectionViewDataSource
{
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return bannerDetailsItem.count
    }

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

let cell = image_collection_view.dequeueReusableCell(withReuseIdentifier: "cell", for: 
indexPath) as! ImageCollectionViewCell
        let inputString = BASE_API_URL
        let splits = inputString.components(separatedBy: "api")
        let imageUrl:NSURL = NSURL(string: splits[0] + "storage/" + 
        bannerDetailsItem[indexPath.row].Image)!

        DispatchQueue.global(qos: .userInitiated).async {

            let imageData:NSData = NSData(contentsOf: imageUrl as URL)!

            DispatchQueue.main.async {

                cell.banner_image.image = UIImage(data: imageData as Data)

            }
        }

        return cell
    }
}

在此先感谢您!

这是从 URL 加载图片的好库 SDWebImage

您可以通过 CocoaPods CocoaPods.org

安装

安装好SDWebImage后,可以通过这个例子加载图片:

import SDWebImage

imageView.sd_setImage(with: URL(string: "http://www.example.com/path/to/image.jpg"), placeholderImage: UIImage(named: "placeholder.png"))

1 - 在您的 ImageCollectionViewCell 中创建一个函数,以传递 URL,让单元格处理下载部分

@ImageCollectionViewCell:

func bind(imageUrlPath:String, indexPath:IndexPath) -> Void {

ImageCollectionViewCell.downloadImage(url:imageUrlPath) { (_image) in
        
        DispatchQueue.main.async {
            
            if (self.tag == indexPath.row) {
                
                self. banner_image.image = _image;
            }
        }
    }
}

2 - 使用 URLSession

从收到的 URL 下载图像方法
@ImageCollectionViewCell:

class func downloadImage(url:String,onImage:@escaping ( _ image:UIImage?)-> Void) -> Void {
                
        if let imageURL = URL(string: url) {
            
            let task = URLSession.shared.dataTask(with: imageURL, completionHandler: { (data, response, error) in
                
                if error != nil {
                    return
                }
                if let imageData = data {
                    onImage(UIImage(data: imageData));
                }
                
            });
            task.resume();
        }
    }

3 - 终于在您的控制器中,call/pass 值

@LandingPageViewController:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    
    cell.tag = indexPath.row;

    cell.bind(imageUrlPath: imageUrl, indexPath: indexPath)
        
}