第一次滚动

时间:2015-11-21 21:03:41

标签: ios uitableview

当我第一次滚动浏览时,我的桌面视图过度切碎。一旦显示了所有单元格,滚动变得非常平滑。该表有720行。

Video of problem

我的单元格设置为| image(32x32) - 标签 - 图像(75x22) - 图像(75x22)| :my cell

我在iPhone 6s上测试它。我在资产目录中的图像位于@ 2x插槽中,左图像的大小为64x64,右图像的大小为150x44。他们的文件大小是5-9kb。我没有对细胞高度做任何改变。使用默认值44。

继承我的代码:

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

    cell.thumb.image = UIImage(named: "\(dex[indexPath.row].name!)Thumb")
    cell.name.text = dex[indexPath.row].name
    if dex[indexPath.row].type2 == nil {
        cell.type1.image = nil
        cell.type2.image = UIImage(named: dex[indexPath.row].type1!)
    } else {
        cell.type1.image = UIImage(named: dex[indexPath.row].type1!)
        cell.type2.image = UIImage(named: dex[indexPath.row].type2!)
    }
    // check to make sure cells are being reused.
    if cell.tag != 999 {
        cell.tag = 999
        print("cell \(++self.cells)")
    }
    return cell
}

如果删除设置拇指图像的线条,则表格完美无缺。我也不了解内存使用情况。

使用拇指图像:launch = 12.2mb,一直滚动到第720行= 75.5mb(?!?!)

没有拇指图像:launch = 10.3mb,一直滚动到第720行= 12.1mb

所以,让我们说每个拇指图像都是10kb,如果加载的都是最大约7mb。

非常感谢任何帮助/想法!

更新:

通过这样做尝试了zp_x的建议:

var thumbs : [UIImage] = []
func getThumbs() {
    for x in 0...719 {
        thumbs.append(UIImage(named: "\(dex[x].name!)Thumb")!)
    }
}

在viewDidLoad中调用getThumbs()。这完全消除了波动,但应用现在需要约7秒才能加载页面。此外,一旦加载的内存使用量从~114mb开始,但一直滚动到最后一行只会将使用量增加到~126mb。滚动时的CPU使用率也比以前高很多。

有没有人知道拇指图像发生了什么?我不明白内存使用量会增加多少。拇指的文件大小为5-9kb。所以说最大* 720拇指甚至10kb = 7200kb~7mb。很困惑......

2 个答案:

答案 0 :(得分:0)

尝试在你的cellForRowAtIndexPath中执行此操作 您应该尝试在异步块中加载资产,这有助于在很大程度上提高性能。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
            //Start the process to read the image.

            dispatch_sync(dispatch_get_main_queue(), { () -> Void in
                //set the image in here.
                cell.thumb.image = UIImage(named: "\(dex[indexPath.row].name!)Thumb")
                if dex[indexPath.row].type2 == nil {
                    cell.type1.image = nil
                    cell.type2.image = UIImage(named: dex[indexPath.row].type1!)
                } else {
                    cell.type1.image = UIImage(named: dex[indexPath.row].type1!)
                    cell.type2.image = UIImage(named: dex[indexPath.row].type2!)
                }

            })
        }

答案 1 :(得分:0)

您正在同步加载所有图像。从bundle的资源加载图像时,iOS会对它们进行缓存(因此:它们不会被卸载)。这就是为什么第二次滚动将是顺利的。

您应该预先缓存所有图像(通过仅为每个图像调用UIImang(命名为)),或者在单独的线程中触发UIImage(名为:)并将UIImage对象移交给主线程上的图像视图。