1

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

 }
4

5 回答 5

2

它可能不流畅,因为您需要缓存图像并在主线程中进行下载过程(阅读有关 GCD)。对于缓存,您可以采用两种方式(至少):

1)制作你自己的图像数组,它们将被缓存

2) 以 KingFisher 为例,单击。它将缓存您的图像。例如:

yourImageView.kf.setImage(with: URL) // next time, when you will use image with this URL, it will be taken from cache.

希望能帮助到你

于 2017-03-17T11:25:45.463 回答
2

您可以使用 SDWebImage 下载图像数组,并在 imageView 中添加一个占位符图像。这是功能

 public func sd_setImageWithURL(url: NSURL!, placeholderImage placeholder: UIImage!)

它使用起来很简单

 myImageView.sd_setImageWithURL(NSURL(string:image), placeholderImage:UIImage(named:"qwerty"))

确保cellforRowAtIndexpath通过将 imageview image 设置为 nil来重置tableView 委托方法中的 imageView

myImageView.image = nil
//now set image in imageView
myImageView.sd_setImageWithURL(NSURL(string:image), placeholderImage:UIImage(named:"qwerty"))

这避免了图像重复和图像的怪异行为,因为每个单元格的 imageview在重用之前都被重置。Github 链接 -> https://github.com/rs/SDWebImage

于 2017-03-17T11:39:08.370 回答
1

你必须使用多线程。只有UI设置在主线程中,后台下载图像在另一个线程中。通过这种方式你可以解决你的问题。

于 2017-03-17T11:35:16.477 回答
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"))

我在许多现场项目中使用它,它就像一个魅力:)

于 2017-03-17T11:36:04.877 回答
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()
        }
    }
}
于 2017-03-17T15:52:11.063 回答