【问题标题】:UITableView displaying webImages in Swift languages seems to freeze以 Swift 语言显示 webImages 的 UITableView 似乎冻结了
【发布时间】:2015-10-05 14:26:35
【问题描述】:

所以我对 iOS 和 Swift 也很陌生(实际上只有一个半月)。所以我正在尝试制作一个表格视图,显示一些来自网络的图像,我设法从网络 API 获取正确的信息并将它们显示在表格视图中。但是,带有在线图像的tableview似乎冻结了,我应该等待2-3秒让它移动一点然后再次冻结,这非常令人沮丧。 我知道它与同步有关,我也尝试过dispatch_async(dispatch_get_main_queue()){},并且由于我正在使用 Swift 而不是 ObJ 进行开发,因此我尝试了来自 Github 的名为 Kingfisher 的开源 Web Image 下载帮助程序,但它并没有解决我的问题. 所以,请帮助我,谢谢。 为简单起见,这里是演示代码

var arrays = [
"NPWR02174_00_013F09F4AE3D70230FA695261A8E994D275DF62333/C878A05EF327D7D42E2AF5E1EE15672A1509962C.PNG",
"NPWR04270_00_01C53CAC0BACAC6F052AE4B968370CF9B899DDA81E/C1E1A8AD62EDE2FB95C3BD562F2783F157A0D011.PNG",
"NPWR04472_00_01CB90FF28A2EBB55D210932F56935B377E7A28ECB/DCA2F66365777A7330F685CD8CD5F90F2FE62671.PNG",
"NPWR04841_00_017B982A2A44BB607DECD77484C4670CCB505B65E4/91824E16D16C2789CC34A2F5F5444CD30D71C8F1.PNG",
"NPWR05212_00_018ADD99CEA95C240EFDC92FB993F6BC8C0AF7904D/7266E29159EE69D31AA24FB94BC0E90F5306774A.PNG",
"NPWR05254_00_015EB28BB38A5580D6A73CA0BDFB2F8C6864F85F66/76ED779ECE98E63E8A1A229AE626F62E8325D703.PNG",
"NPWR05257_00_01CB48AFF2A9F0795B5569E1DABBC612E3FA13B79A/3524288D6B1E5B4F51CF7DEA4A3E621913A1BA8C.PNG",
"NPWR05326_00_01DF67B968910B06FDABD8A2C2C6AAB72E0DD47048/8AB6EC3EC992C35472F02DD0C8D4122302C802E1.PNG",
"NPWR05401_00_0188285B6025E65909B39E295D2542DF589EDCCC38/620822A98E3CFC1CFB3B5EDCF3F00B19A5B328C2.PNG",
]

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return arrays.count

}

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = self.tableview.dequeueReusableCellWithIdentifier("gameCell")!
    dispatch_async(dispatch_get_main_queue()){
        let image = cell.viewWithTag(101) as! UIImageView

    let imageString = arrays[indexPath.row] as! String

    let imageURL = NSURL(string: "https://trophy01.np.community.playstation.net/trophy/np/"+imageString)!

    let data = NSData(contentsOfURL: imageURL)!

        image.image = UIImage(data: data)}

    return cell

}

【问题讨论】:

  • 尝试使用 alamofire github.com/Alamofire/Alamofire 或 AlamofireImage github.com/Alamofire/AlamofireImage
  • 我尝试使用另一个名为 Kingfisher 的开源项目,它是 SDWebImage 的 swift 版本,但它不起作用,所以我猜我自己的代码有问题。
  • 所以我尝试了 Alamofire,并使用 Alamofire.request(.GET,URL).responseJSON() { (request, response, result) 获取 JSON 结果并成功显示在我的表格视图中,但是......表格视图仍然冻结!我确实尝试了所有可能的方法,也许 Alamofire 中有一些关于异步的东西我没有使用?请帮帮我。
  • 移除异步调度

标签: ios swift tableview webimage


【解决方案1】:

这是因为您正在同步下载图像。这是执行此操作的代码行。

let data = NSData(contentsOfURL: imageURL)

尝试异步下载图像,然后在下载图像后更新单元格。签出这个答案How to async load images on dynamic UITableView?

【讨论】:

  • 所以我改变了我的代码如下:dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) { let data = NSData(contentsOfURL: imageURL)! dispatch_async(dispatch_get_main_queue()){ image.image = UIImage(data: data)} } 它确实加载图片超级快而且不会再次冻结,但是有一个新问题,超时我滚动,新图片出现在同一个单元格中.. .非常奇怪
  • 您需要实现图像缓存机制,这样您就不会重新下载已经下载的图像。为此, > 创建一个可变集合(数组或字典) > 下载图像后,将其添加到您的集合并更新单元格图像 > 在“cellForRowAtIndexPath:”中放置一个“If-else”,您需要先检查是否该图像已存在于集合中。如果是,则使用缓存更新图像,否则下载图像。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
相关资源
最近更新 更多