Swift - UITableView滞后于图像

时间:2015-02-07 09:40:39

标签: ios uitableview swift xcode6

我的问题是当我向下滚动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
    }

请建议如何顺利。

2 个答案:

答案 0 :(得分:4)

OMG,不仅在滚动控件中这样做,而且在一般的UI中也是这样:

  

data = NSData(contentsOfURL:url)

这就是为什么你表示滞后,你很幸运能够快速上网。如果您的连接速度很慢,那么您的app会挂起,可能会永远。总是不经意地做网络!

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

  

UIImage(数据:数据)

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

  

cell.viewWithTag(101)

所以,使用一些库来下载图像,这显然不是那么简单的任务,根据你的经验,你不会自己做正确的事(我可以看到)。

为您的单元格制作单独的课程,并使用IB连接插座。

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

答案 1 :(得分: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
    }