用于在 UICollectionView 中下载和显示图像的 UIImageView 扩展
UIImageView Extension for Downloading and Displaying Images in UICollectionView
我制作并扩展了 UIImageView,它允许我异步下载图像,然后根据它们的特定索引(CollectionView 中的 IndexPath)将它们分配给它们的 ImageView。效果很好,唯一的问题是:
- 我在快速滚动和停止时仍然看到显示错误的图像。
有人可以帮帮我吗?这是我的代码:
// UIImageView 扩展:
extension ExtendedUIImageView {
func downloadFrom(link link:String, contentMode mode: UIViewContentMode, imageIndex: Int) {
if (NSFileManager.defaultManager().fileExistsAtPath(link)) {
self.image = UIImage(contentsOfFile: link)
return
}
self.imageURL = NSURL(string: link)
let url = NSURL(string: link)
contentMode = mode
NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
guard
let httpURLResponse = response as? NSHTTPURLResponse where httpURLResponse.statusCode == 200,
let mimeType = response?.MIMEType where mimeType.hasPrefix("image"),
let data = data where error == nil,
let image = UIImage(data: data)
else { return }
dispatch_async(dispatch_get_main_queue()) { () -> Void in
if (url == self.imageURL) {
self.image = image
}
}
}).resume()
}
}
// 我将像这样调用此方法:
self.previewImageView?.downloadFrom(link: localPath, contentMode: .ScaleAspectFill, imageIndex: cell.indexPath.item)
// 其中:
var previewImageView: ExtendedUIImageView?
请帮助我:-O
你好~我前段时间一直在尝试做同样的事情。这就是我所做的。这对我来说很简单,而且工作正常,没有任何问题。
import Foundation
import UIKit
extension UIImageView {
//load image async from inaternet
func loadFromURL(photoUrl:String){
//NSURL
let url = NSURL(string: photoUrl)
//Request
let request = NSURLRequest(URL:url!);
//Session
let session = NSURLSession.sharedSession()
//Data task
let datatask = session.dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
if error != nil {
print(error?.localizedDescription)
}
dispatch_async(dispatch_get_main_queue()) {
self.image = UIImage(data: data!)
}
}
datatask.resume()
}
}
使用 Kingfisher 进行缓存
import Foundation
import UIKit
import Kingfisher
public extension UIImageView {
func loadAvatar(url: URL) {
self.kf.setImage(with: url, placeholder: UIImage(named: "default-avatar"), options: [.transition(.fade(0.2))])
}
func setImageWithIndicator(url: URL) {
self.kf.indicatorType = .activity
self.kf.setImage(with: url)
}
}
我制作并扩展了 UIImageView,它允许我异步下载图像,然后根据它们的特定索引(CollectionView 中的 IndexPath)将它们分配给它们的 ImageView。效果很好,唯一的问题是:
- 我在快速滚动和停止时仍然看到显示错误的图像。
有人可以帮帮我吗?这是我的代码:
// UIImageView 扩展:
extension ExtendedUIImageView {
func downloadFrom(link link:String, contentMode mode: UIViewContentMode, imageIndex: Int) {
if (NSFileManager.defaultManager().fileExistsAtPath(link)) {
self.image = UIImage(contentsOfFile: link)
return
}
self.imageURL = NSURL(string: link)
let url = NSURL(string: link)
contentMode = mode
NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
guard
let httpURLResponse = response as? NSHTTPURLResponse where httpURLResponse.statusCode == 200,
let mimeType = response?.MIMEType where mimeType.hasPrefix("image"),
let data = data where error == nil,
let image = UIImage(data: data)
else { return }
dispatch_async(dispatch_get_main_queue()) { () -> Void in
if (url == self.imageURL) {
self.image = image
}
}
}).resume()
}
}
// 我将像这样调用此方法:
self.previewImageView?.downloadFrom(link: localPath, contentMode: .ScaleAspectFill, imageIndex: cell.indexPath.item)
// 其中:
var previewImageView: ExtendedUIImageView?
请帮助我:-O
你好~我前段时间一直在尝试做同样的事情。这就是我所做的。这对我来说很简单,而且工作正常,没有任何问题。
import Foundation
import UIKit
extension UIImageView {
//load image async from inaternet
func loadFromURL(photoUrl:String){
//NSURL
let url = NSURL(string: photoUrl)
//Request
let request = NSURLRequest(URL:url!);
//Session
let session = NSURLSession.sharedSession()
//Data task
let datatask = session.dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
if error != nil {
print(error?.localizedDescription)
}
dispatch_async(dispatch_get_main_queue()) {
self.image = UIImage(data: data!)
}
}
datatask.resume()
}
}
使用 Kingfisher 进行缓存
import Foundation
import UIKit
import Kingfisher
public extension UIImageView {
func loadAvatar(url: URL) {
self.kf.setImage(with: url, placeholder: UIImage(named: "default-avatar"), options: [.transition(.fade(0.2))])
}
func setImageWithIndicator(url: URL) {
self.kf.indicatorType = .activity
self.kf.setImage(with: url)
}
}