使用下载图像时UITableView不流畅

时间:2017-03-17 11:14:11

标签: ios swift alamofire alamofireimage

我是使用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;
    }
}

 }

5 个答案:

答案 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()
        }
    }
}