Swift - UITableView 滞后于图像

问题描述 投票:0回答:2

我的问题是当我向下滚动 UITableView 时,它看起来太滞后了。图片来自 Facebook。

我的代码:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCellWithIdentifier("UserCell", forIndexPath: indexPath) as UITableViewCell

        let user = users[indexPath.row] as User //2
        
        if let nameLabel = cell.viewWithTag(100) as? UILabel { //3
            nameLabel.text = user.name
        }
        
        if let dateCreatedLabel = cell.viewWithTag(101) as? UILabel {
        dateCreatedLabel.text = user.distance
        }
        
        if let profilePictureView = cell.viewWithTag(103) as? UIImageView {
            if let url = NSURL(string: "https://graph.facebook.com/\(user.profilePhoto)/picture?type=large") {
                if let data = NSData(contentsOfURL: url){
                    profilePictureView.contentMode = UIViewContentMode.ScaleAspectFit
                    profilePictureView.image = UIImage(data: data)
                }
            }
        }
        return cell
    }

怎样才能让它顺利?

ios uitableview swift xcode6
2个回答
4
投票

天哪,不仅在滚动控件中,而且在一般 UI 中也不要这样做:

数据 = NSData(contentsOfURL: url)

这就是为什么你的桌子会滞后,而且你很幸运有快速的互联网。如果您的连接速度很慢,您的应用程序将挂起,可能会永远挂起。始终异步进行网络!

此外,当你使网络异步时,你的 tableView 仍然会滞后于此处:

UIImage(数据:数据)

即使在这里,如果你的单元格中有很多控件:

cell.viewWithTag(101)

因此,使用一些库来下载图像,这令人惊讶地并不像看起来那么容易,根据您的经验,您不会自己做正确的事情(正如我所见)。

为您的单元创建单独的类并使用 IB 连接插座。

尝试 AFNetworking,它有 UIImageView 的类别来下载图像。


3
投票

我已经找到答案了。使用

Haneke
代替
NSData

import Haneke

/* .. */

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

        let cell = tableView.dequeueReusableCellWithIdentifier("UserCell", forIndexPath: indexPath) as UITableViewCell

        let user = users[indexPath.row] as User //2

        if let nameLabel = cell.viewWithTag(100) as? UILabel { //3
            nameLabel.text = user.name
        }

        if let dateCreatedLabel = cell.viewWithTag(101) as? UILabel {
        dateCreatedLabel.text = user.distance
        }

        if let profilePictureView = cell.viewWithTag(103) as? UIImageView {
            if let url = NSURL(string: "https://graph.facebook.com/\(user.profilePhoto)/picture?type=large") {
                    profilePictureView.contentMode = UIViewContentMode.ScaleAspectFit
                    profilePictureView.hnk_setImageFromURL(url!)

            }
        }
        return cell
    }
© www.soinside.com 2019 - 2024. All rights reserved.