我的问题是当我向下滚动 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
}
怎样才能让它顺利?
天哪,不仅在滚动控件中,而且在一般 UI 中也不要这样做:
数据 = NSData(contentsOfURL: url)
这就是为什么你的桌子会滞后,而且你很幸运有快速的互联网。如果您的连接速度很慢,您的应用程序将挂起,可能会永远挂起。始终异步进行网络!
此外,当你使网络异步时,你的 tableView 仍然会滞后于此处:
UIImage(数据:数据)
即使在这里,如果你的单元格中有很多控件:
cell.viewWithTag(101)
因此,使用一些库来下载图像,这令人惊讶地并不像看起来那么容易,根据您的经验,您不会自己做正确的事情(正如我所见)。
为您的单元创建单独的类并使用 IB 连接插座。
尝试 AFNetworking,它有 UIImageView 的类别来下载图像。
我已经找到答案了。使用
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
}