UITableView平滑滚动

时间:2015-09-03 11:20:12

标签: ios swift uitableview

我在每个单元格中都有UITableView图像,我希望滚动顺畅。所以我在stackerflow上读了一些帖子,现在我在后台线程中加载我的图片:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell: BuildingStatusCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! BuildingStatusCell
    cell.selectionStyle = UITableViewCellSelectionStyle.None
    var node = nodesArray[indexPath.row] as! NSMutableDictionary
    if !checkIfImagesLoaded(node[Api.pictures] as! NSMutableArray) {
        cell.id = node[Api.buildingStatusId] as! Int
        cell.date.text =  node[Api.date] as? String
        cell.count.text = String((node[Api.pictures] as! NSMutableArray).count)
        cell.indicator.hidesWhenStopped = true
        cell.indicator.startAnimating()
        dbHelper.getBuildingStatusNode(node, callback: self)
    } else {
        cell.id = node[Api.buildingStatusId] as! Int
        cell.date.text =  node[Api.date] as? String
        cell.count.text = String((node[Api.pictures] as! NSMutableArray).count)
        dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)) {
            var image = WorkWithImage.loadImageFromSD((node[Api.pictures] as! NSMutableArray)[0]["image"] as! String)! // Bad
            dispatch_async(dispatch_get_main_queue()) {
                cell.imgView.image = image
                cell.indicator.stopAnimating()
            }
        }
    }
    return cell
}

dbHelper.getBuildingStatusNode(node,callback:self)方法也在后台线程中执行。但由于某些原因,当我滚动时,我仍然有一些延迟。我读到用tableView中的数据填充我的单元格是好的:willDisplayCell方法而不是tableView:cellForRowAtIndexPath我应该在tableView:cellForRowAtIndexPath方法中尽可能快地返回单元格。问题是我现在应该使用这样的代码:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell: BuildingStatusCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! BuildingStatusCell
    cell.selectionStyle = UITableViewCellSelectionStyle.None
    return cell
}

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    var cell: BuildingStatusCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! BuildingStatusCell
    var node = nodesArray[indexPath.row] as! NSMutableDictionary
    if !checkIfImagesLoaded(node[Api.pictures] as! NSMutableArray) {
        cell.id = node[Api.buildingStatusId] as! Int
        cell.date.text =  node[Api.date] as? String
        cell.count.text = String((node[Api.pictures] as! NSMutableArray).count)
        cell.indicator.hidesWhenStopped = true
        cell.indicator.startAnimating()
        dbHelper.getBuildingStatusNode(node, callback: self)
    } else {
        cell.id = node[Api.buildingStatusId] as! Int
        cell.date.text =  node[Api.date] as? String
        cell.count.text = String((node[Api.pictures] as! NSMutableArray).count)
        dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)) {
            var image = WorkWithImage.loadImageFromSD((node[Api.pictures] as! NSMutableArray)[0]["image"] as! String)!
            dispatch_async(dispatch_get_main_queue()) {
                cell.imgView.image = image
                cell.indicator.stopAnimating()
            }
        }
    }
}

还有什么可以让我的滚动更顺畅? BCS即使我使用willDisplayCell方法,我仍然有滞后。

P.S。我的UITableViewCells中的图像大小是固定的。

3 个答案:

答案 0 :(得分:6)

尝试以下

  • 尝试删除任何阴影。
  • 使单元格及其子视图不透明。不要使用alpha / transparency。
  • 尝试在后台线程上解码图像: Decode images in background thread?

答案 1 :(得分:1)

首先,最好将UITableViewCell子类化,然后将Api对象传递给单元格,并在单元格内进行映射。

最好使用一些库,如:AFNetworking的扩展名或AsyncImageView - 可以在Swift中使用。

尝试删除任何边框圆角,阴影,透明胶片 - 它们可能会导致延迟。在这种情况下,您需要光栅化:

相关问题: Sluggish scrolling experience when using QuartzCore to round corners on UIImageView's within a UITableViewCell

答案 2 :(得分:-3)

从URL加载图片时,下载图片需要时间,导致滚动UITableView时出现阻塞。 你做了这么多工作

  1. 使用此课程SDWebImage

  2. 并在您的桥接头文件中:

    #import "UIImageView+WebCache.h"

  3. 以下是一个应该有效的代码示例:

    let block: SDWebImageCompletionBlock! = {(image: UIImage!, error: NSError!, cacheType: SDImageCacheType!, imageURL: NSURL!) -> Void in
        println(self)
    }
    
    let url = NSURL(string: node[Api.pictures] as! NSMutableArray)[0]["image"] as! String)
    
    cell.imgView.sd_setImageWithURL(url, completed: block)