Swift TableView单元格图像最初无序加载

时间:2017-02-08 03:46:54

标签: swift

在第一个View Controller上我有一个tableview,其中列出了google,堆栈溢出等各种网站...对于添加的每个服务,将根据该网站的第一个字母加载图片。因此,T的图像将加载到Twitter。

如果用户希望他/她可以点击该单元格并转到第二个VC并添加URL。当用户回到第一个VC时,该网站会尝试拉取图标而不是字母图像......这样可行但不优雅。

我最初想要的是每个图片加载后立即显示,显然不是一次性显示而不是因为它会破坏用户与应用程序的交互。

现在发生的事情是,它们一次只显示几个(没关系),但最初并不是在正确的位置。所以说我有亚马逊,谷歌,微软,Facebook和苹果......它们实际上会出现故障,因此微软可能会使用谷歌标识,几秒后它可能转移到Facebook,然后取决于它可能有多少再次转移,直到它都在正确的匹配位置...如果我在“折叠下方”滚动并且在几分钟之后它会自行调整(但是单元格标题保持有序),也会发生这种情况。

所以我显然在我的代码中有一些错误的东西,并且至少会喜欢它,所以它首次将Facebook置于正确状态,然后谷歌等等

或者另一个选项可能是所有图像以字母图像开头,然后代码尝试用图标替换它......并在第一次尝试时正确...

任何帮助都会很棒

这是我的Table View cellForRowAt代码

  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
  }
}

1 个答案:

答案 0 :(得分:1)

cell.serviceLogoImage.image =  

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

Apple Documentation

  

注意大多数情况下,只能从应用程序的main中使用UIKit类   线。对于从UIResponder派生的类尤其如此   或者涉及以任何方式操纵应用程序的用户界面。

Check this thread如何从背景和主要运行不同的线程。