如何在 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)
}
我是 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
@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)
}