我是使用Swift进行IOS开发的新手。我创建了1个UITableView并在下载数据后显示图像。但是当我滚动时,它不是很平滑,有些时间图像显示在错误的位置。
我使用AlamofireImage库进行图像下载和显示。有没有快速的图书馆?
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:HomePageCell = tableView.dequeueReusableCell(withIdentifier: "HomePage", for: indexPath) as! HomePageCell
cell.configure( homeData[0], row: indexPath, screenSize: screenSize,
hometableview: self.homeTableView);
return cell
}
import UIKit
import Alamofire
import AlamofireImage
class HomePageCell: UITableViewCell {
@IBOutlet weak var bannerImage: UIImageView!
func configure(_ homeData: HomeRequest, row: IndexPath, screenSize: CGRect, hometableview: UITableView) {
let callData = homeData.banner_lead_stories[(row as NSIndexPath).row]
let url = Constants.TEMP_IMAGE_API_URL + callData.lead_story[0].bg_image_mobile;
if( !callData.lead_story[0].bg_image_mobile.isEmpty ) {
if bannerImage?.image == nil {
let range = url.range(of: "?", options: .backwards)?.lowerBound
let u = url.substring(to: range!)
Alamofire.request(u).responseImage { response in
debugPrint(response)
//print(response.request)
// print(response.response)
// debugPrint(response.result)
if let image = response.result.value {
// print("image downloaded: \(image)")
self.bannerImage.image = image;
self.bannerImage.frame = CGRect(x: 0, y: 0, width: Int(screenSize.width), height: Int(screenSize.width/1.4))
}
}
}
} else {
self.bannerImage.image = nil;
}
}
}
答案 0 :(得分:2)
它可能不顺畅,因为您需要缓存图像并在主线程中进行下载过程(阅读GCD)。 对于缓存,您可以采用两种方式(至少):
1)创建自己的图像数组,以便缓存它们
2)使用KingFisher例如click。它会缓存你的图像。 例如:
yourImageView.kf.setImage(with: URL) // next time, when you will use image with this URL, it will be taken from cache.
希望有所帮助
答案 1 :(得分:2)
您可以使用SDWebImage下载图像阵列,并在imageView中添加占位符图像。这是功能
public func sd_setImageWithURL(url: NSURL!, placeholderImage placeholder: UIImage!)
它和
一样容易使用 myImageView.sd_setImageWithURL(NSURL(string:image), placeholderImage:UIImage(named:"qwerty"))
通过将imageview图像设置为nil,确保在tableView委托cellforRowAtIndexpath
方法中重置imageView
myImageView.image = nil
//now set image in imageView
myImageView.sd_setImageWithURL(NSURL(string:image), placeholderImage:UIImage(named:"qwerty"))
这可以避免图像重复,并且在重新使用之前,重置每个单元格的图像的奇怪行为重置。 Github链接 - > https://github.com/rs/SDWebImage
答案 2 :(得分:1)
你必须使用多线程。只有UI在主线程中设置,后台下载图像在另一个线程中。通过这种方式你可以解决你的问题。
答案 3 :(得分:1)
尝试使用SDWebImage库,它会自动将图像保存在catch中,并且tableView将顺利运行。
Github链接 - > https://github.com/rs/SDWebImage
安装窗格:
platform :ios, '7.0'
pod 'SDWebImage', '~>3.8'
只需导入SDWebImage,如:
@import SDWebImage
并像这样使用:
imageView.sd_setImage(with: URL(string: "http://www.example.com/path/to/image.jpg"), placeholderImage: UIImage(named: "placeholder.png"))
我在很多现场项目中都使用它,它就像一个魅力:)
答案 4 :(得分:1)
使用此扩展程序缓存图片,也不要忘记更新主线程上的任何UI。
let imageCache = NSCache<NSString, UIImage>()
extension UIImageView {
func loadImageUsingCacheWithURLString(_ URLString: String, placeHolder: UIImage?) {
self.image = nil
if let cachedImage = imageCache.object(forKey: NSString(string: URLString)) {
self.image = cachedImage
return
}
if let url = URL(string: URLString) {
URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
//print("RESPONSE FROM API: \(response)")
if error != nil {
print("ERROR LOADING IMAGES FROM URL: \(error)")
DispatchQueue.main.async {
self.image = placeHolder
}
return
}
DispatchQueue.main.async {
if let data = data {
if let downloadedImage = UIImage(data: data) {
imageCache.setObject(downloadedImage, forKey: NSString(string: URLString))
self.image = downloadedImage
}
}
}
}).resume()
}
}
}