首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速加载TableView单元图像

问快速加载TableView单元图像
EN

Stack Overflow用户
提问于 2017-02-08 03:46:53
回答 1查看 139关注 0票数 0

在第一个视图控制器上,我有一个表视图,其中列出了各种站点,比如google,堆栈溢出.对于添加的每个服务,将根据该站点的第一个字母加载图像。所以一个T的图片会加载到Twitter上。

如果用户需要,他/她可以点击那个单元,进入第二个VC并添加URL。当用户返回到第一个VC时,该站点将尝试提取图标而不是字母图像.这是可行的,但不是优雅的。

我最初想要的是,每一张图片一加载就会显示出来,显然不是一次就显示出来的,所以它会干扰用户与应用程序的交互。

现在正在发生的是,他们一次出现几个(这是好的),但不是在正确的地方,最初。因此,假设我有亚马逊、谷歌、微软、Facebook和apple...the图标,那么微软可能会出现googles徽标,几秒钟后它可能会转移到Facebook,然后取决于它可能会移动多少,直到它完全匹配为止--…。这也会发生,如果我滚动‘下面的折叠’,几分钟后,将正确本身(然而,单元格标题保持有序)。

所以很明显,我的代码有问题,我希望至少能得到它,这样它第一次就会把Facebook放在正确的位置,然后再用google等等。

或者另一个选项是,所有的图像都从字母图像开始,然后代码尝试用favicon...and替换它,在第一次尝试时让它正确。

任何帮助都是很好的

这是我的表视图cellForRowAt代码

代码语言:javascript
复制
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "serviceCell", for: indexPath as IndexPath) as! ServiceTableViewCell
    let row = indexPath.row

    cell.serviceNameLabel.text = serviceArray[row].serviceName

    DispatchQueue.global().async {

      let myURLString: String = "http://www.google.com/s2/favicons?domain=\(self.serviceArray[row].serviceUrl)"

      if let myURL = URL(string: myURLString), let myData = try? Data(contentsOf: myURL), let image = UIImage(data: myData) {

        cell.serviceLogoImage.image = image

      } else {

        cell.serviceLogoImage.image = UIImage.init(named: "\(self.getLetterOrNumberAndChooseImage(text: self.serviceArray[row].serviceName))")

      }
    }
    return cell
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-08 22:44:10

代码语言:javascript
复制
cell.serviceLogoImage.image =  

必须从主线程调用,因为您正在修改用户界面。

苹果文档

注大多数情况下,只使用应用程序主线程中的UIKit类。对于从UIResponder派生的类,或者涉及以任何方式操作应用程序的用户界面的类,这一点尤其适用。

检查这个线程如何从后台和主线程运行不同的线程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42104326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档