UITableView使用下载图片时不流畅
UITableView is not smoothly when using downloading images
我是 IOS 使用 Swift 开发的新手。下载数据后,我创建了 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;
}
}
}
它可能并不顺利,因为您需要缓存图像并在不在主线程中进行下载过程(阅读 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.
希望对您有所帮助
你必须使用multithreading.Only UI设置在主线程,后台下载图片在另一个thread.By这样你就可以解决你的问题。
试用 SDWebImage 库,它会自动将图像保存在 catch 中,并且您的 tableView 会顺利运行。
Github link -> https://github.com/rs/SDWebImage
安装 pod:
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"))
我在许多现场项目中使用过它,它的效果非常好:)
您可以使用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 link -> https://github.com/rs/SDWebImage
使用此扩展来缓存您的图像,并且不要忘记在主线程上更新任何 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()
}
}
}
我是 IOS 使用 Swift 开发的新手。下载数据后,我创建了 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;
}
}
}
它可能并不顺利,因为您需要缓存图像并在不在主线程中进行下载过程(阅读 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.
希望对您有所帮助
你必须使用multithreading.Only UI设置在主线程,后台下载图片在另一个thread.By这样你就可以解决你的问题。
试用 SDWebImage 库,它会自动将图像保存在 catch 中,并且您的 tableView 会顺利运行。
Github link -> https://github.com/rs/SDWebImage
安装 pod:
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"))
我在许多现场项目中使用过它,它的效果非常好:)
您可以使用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 link -> https://github.com/rs/SDWebImage
使用此扩展来缓存您的图像,并且不要忘记在主线程上更新任何 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()
}
}
}