加载完成后显示 UIImageView
Showing UIImageView after finished loading
目前我有一个缩略图的集合视图,按下该缩略图单元格后,它应该调用一个函数,该函数将通过 API 检索图像数据并通过隐藏的 ImageView 显示完整图像。
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
dataManager.downloadAttachment(id: attachments[indexPath.row].attachmentID)
if dataManager.dataHolder != nil {
attachmentImage.image = UIImage.init(data: dataManager.dataHolder!)
attachmentImage.isHidden = false
}
print(attachments[indexPath.row].attachmentID)
}
和
func downloadAttachment(id:Int) {
let finalUrl = "\(urlAttachment)\(id)/data"
if let url = URL(string: finalUrl){
var request = URLRequest(url: url)
request.setValue(apiKey, forHTTPHeaderField: header)
let session = URLSession(configuration: .default)
let task = session.dataTask(with: request) { (data, response, error) in
if error != nil {
print(error!)
return
}
print("Attachment Downloaded")
self.dataHolder = data
}
task.resume()
}
}
这个明显的问题是图像不会在第一次尝试时显示,因为它仍然会检索图像并且 dataHolder 仍然是 nil,但是如果我点击单元格两次,然后图像将正确显示。
有没有一种简单的方法可以只点击一次并让它显示一个占位符直到完成下载并相应地用实际图像更新占位符?或者任何其他正确的方法来处理这个问题?
您可以使用闭包来实现您的要求。更新后的代码如下所示。
func downloadAttachment(id:Int,completionHandler completion: @escaping ((Data)->Void)) {
let finalUrl = "\(urlAttachment)\(id)/data"
if let url = URL(string: finalUrl){
var request = URLRequest(url: url)
request.setValue(apiKey, forHTTPHeaderField: header)
let session = URLSession(configuration: .default)
let task = session.dataTask(with: request) { (data, response, error) in
if error != nil {
print(error!)
return
}
print("Attachment Downloaded")
self.dataHolder = data
completion()
}
task.resume()
}
}
现在在 collectionView DidSelectItemAt 中进行此更改
func collectionView (_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
dataManager.downloadAttachment(id: attachments[indexPath.row].attachmentID,completionHandler: { data in
if let cell = collectionView.cellForItem(at: indexPath),
let data = dataManager.dataHolder,
let image = UIImage.init(data: data){
attachmentImage.image = image
attachmentImage.isHidden = false
}
})
}
目前我有一个缩略图的集合视图,按下该缩略图单元格后,它应该调用一个函数,该函数将通过 API 检索图像数据并通过隐藏的 ImageView 显示完整图像。
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
dataManager.downloadAttachment(id: attachments[indexPath.row].attachmentID)
if dataManager.dataHolder != nil {
attachmentImage.image = UIImage.init(data: dataManager.dataHolder!)
attachmentImage.isHidden = false
}
print(attachments[indexPath.row].attachmentID)
}
和
func downloadAttachment(id:Int) {
let finalUrl = "\(urlAttachment)\(id)/data"
if let url = URL(string: finalUrl){
var request = URLRequest(url: url)
request.setValue(apiKey, forHTTPHeaderField: header)
let session = URLSession(configuration: .default)
let task = session.dataTask(with: request) { (data, response, error) in
if error != nil {
print(error!)
return
}
print("Attachment Downloaded")
self.dataHolder = data
}
task.resume()
}
}
这个明显的问题是图像不会在第一次尝试时显示,因为它仍然会检索图像并且 dataHolder 仍然是 nil,但是如果我点击单元格两次,然后图像将正确显示。
有没有一种简单的方法可以只点击一次并让它显示一个占位符直到完成下载并相应地用实际图像更新占位符?或者任何其他正确的方法来处理这个问题?
您可以使用闭包来实现您的要求。更新后的代码如下所示。
func downloadAttachment(id:Int,completionHandler completion: @escaping ((Data)->Void)) {
let finalUrl = "\(urlAttachment)\(id)/data"
if let url = URL(string: finalUrl){
var request = URLRequest(url: url)
request.setValue(apiKey, forHTTPHeaderField: header)
let session = URLSession(configuration: .default)
let task = session.dataTask(with: request) { (data, response, error) in
if error != nil {
print(error!)
return
}
print("Attachment Downloaded")
self.dataHolder = data
completion()
}
task.resume()
}
}
现在在 collectionView DidSelectItemAt 中进行此更改
func collectionView (_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
dataManager.downloadAttachment(id: attachments[indexPath.row].attachmentID,completionHandler: { data in
if let cell = collectionView.cellForItem(at: indexPath),
let data = dataManager.dataHolder,
let image = UIImage.init(data: data){
attachmentImage.image = image
attachmentImage.isHidden = false
}
})
}