【发布时间】:2018-07-16 18:57:45
【问题描述】:
我的程序中有一个带有 dequeueReusableCells 的 UITable 视图 我应该从服务器加载几张图片并在幻灯片中显示它们
我有一个自定义单元格,在配置每个单元格时,我将图像下载到 DispatchQueue.global(qos: .userInitiated).async 和 DispatchQueue.main.async 中,我将下载的图片添加到幻灯片图像中
但是当我开始滚动一些不应该有任何图片的单元格时,有另一个单元格的重复图片
你知道是什么原因造成的吗?!
我正在使用 swift 和 ImageSlideShow pod 来播放每个单元格中的幻灯片
这是我的代码的一些部分:
在我的新闻单元类中,我有以下部分用于获取图像:
class NewsCell: UITableViewCell{
@IBOutlet weak var Images: ImageSlideshow!
@IBOutlet weak var SubjectLbl: UILabel!
@IBOutlet weak var NewsBodyLbl: UILabel!
func configureCell(news: OneNews) {
self.SubjectLbl.text = news.Subject
self.NewsBodyLbl.text = news.Content
if news.ImagesId.count==0{
self.Images.setImageInputs([ImageSource(image: UIImage(named: "ImagePlaceholderIcon")!)])
}
else{
for imgId in news.ImagesId {
let Url = URL(string: "\(BASE_URL)\(NEWS_PATH)/\(imgId)/pictures")
DispatchQueue.global(qos: .userInitiated).async {
let data = try? Data(contentsOf: Url!)
DispatchQueue.main.async {
if let d = data {
let img = UIImage(data: data!)!
imageSrc.append(ImageSource(image: img))
self.Images.setImageInputs(imageSrc);
}
}
}
}
}
self.Images.slideshowInterval = 3
}
这是 cellForRow 方法:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = generalNewsTableView.dequeueReusableCell(withIdentifier: "NewsCell" , for: indexPath) as! NewsCell
if let news = NewsInfo.sharedInstance.getGeneralNews(){
cell.configureCell(news: news[indexPath.row])
}
return cell
}
getGeneralNews() 是一个 getter,它返回一个新闻数组 所以我在 cellForRowAt 中所做的是我在给定的索引路径中获取新闻并用它配置我的单元格。
class NewsInfo {
static var sharedInstance = NewsInfo()
private init(){}
private (set) var generalNews:[OneNews]!{
didSet{
NotificationCenter.default.post(name:
NSNotification.Name(rawValue: "GeneralNewsIsSet"), object: nil)
}
}
func setGeneralNews(allGeneralNews:[OneNews]){
self.generalNews = allGeneralNews
}
func getGeneralNews() -> [OneNews]!{
return self.generalNews
}
}
每条新闻都包含一个图片ID数组
这些是我的 OneNews 类中的字段 变量主题:字符串! 变量内容:字符串! var ImagesId:[Int]!
谢谢!
【问题讨论】:
-
你为什么不显示你的
getGeneralNews()和configureCell(news:)?您可能对这些方法做错了什么。例如,如果getGeneralNews()是一个异步方法,那么您描述的事情很容易发生。无论如何显示足够的代码来解决您的问题。 -
@OOPer 我刚刚编辑了这个问题。请让我知道代码的任何其他部分是否可以提供帮助,并感谢您的时间和努力! :)
-
OOPer 要求您发布这两种方法的代码。也许您应该编辑您的问题以显示这些方法?
-
问题是您假设您对
Data(contentsOf: Url!)的调用将按照您发出它们的顺序完成。他们可能不会。您应该创建一个以 URL 为键的字典并使用它来查找您的图像。实际上,您可能不想将所有图像加载到内存中的数组中。如果您的表格视图变大,您将耗尽内存并崩溃。最好将文件保存到磁盘并保留一组可选文件 URL。 -
@DuncanC 所以不会一遍又一遍地将它们加载为 URL 并让应用程序停止工作几秒钟?!你的意思是每次我想加载图片时,我都应该从它的 URL 中获取它?
标签: ios swift uitableview scroll uiimage