当我第一次滚动浏览时,我的桌面视图过度切碎。一旦显示了所有单元格,滚动变得非常平滑。该表有720行。
我的单元格设置为| 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。很困惑......
答案 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对象移交给主线程上的图像视图。