关于如何异步加载图像和其他下载数据存在很多问题,但是没有关于将这些图像(一旦下载)异步加载到UI中的问题。
我正在尝试在我的UICollectionView上实现60 fps滚动,尽管我正在寻找适用于所有视图的解决方案。
例如,如果我在Assets文件夹中有想要加载到快速滚动的UIScrollView中的图像,则需要时间将它们放入内存然后在UI中绘制。有没有办法先将这些图像缓存在内存中(同时不会损坏内存/使用太多),然后将它们缓存到内存中后加载到单元格中?
我现在明白了,当我说,
cell.imageView.image = UIImage(named: "grapes")
打开并读取资产文件夹grapes
,然后将相应的图像(1x,2x或3x)带入内存。将正确的图像放入内存后,为其分配cell.imageView.image
,然后绘制图像。这准确吗?所有这些都发生在主线程上吗?如果是这样,那么这是否有可能堵塞主线程并导致设备跳过一些帧?
我假设在解决复杂表达式(例如,格式化文本)时会发生类似的过程。如果是这样,那么可以以及如何创建要异步加载的内容,以便主线程不会被阻塞(即使以暂时清空的内容视图为代价)?
答案 0 :(得分:1)
是的,加载和映像到内存可能需要几毫秒。如果图片尺寸不适合用户界面(例如,您依赖contentMode
或scaleAspectFit
之类的.scaleAspectFill
来获取图像,则会特别影响体验适当的大小;或者如果您自己手动调整大小/裁剪图像)。这可能相当无害地导致一些令人惊讶的计算复杂的东西。
通常,它不足以成为问题,但它可能会阻止您达到最佳的60 fps。如果您想获得最佳性能,可以进行异步检索,并将其与table view prefetching或collection view prefetching相结合。
复杂的表达式和文本格式,不太可能引入足够的延迟来防止60 fps。但不要猜测(重新这个或图像)。你应该分析"发布"的fps。通过Instruments构建(启用优化)并查看哪些(如果有的话)对fps有可观察的影响。并且测试你的目标物理设备,而不是模拟器,因为浪费时间过早地优化在物理设备上不会发生的问题是一种耻辱。
答案 1 :(得分:0)
在背景上创建图像,在UI线程上设置:
$('#my-form *').not('.hidden-div').filter(':input').each(function(){
// my validation here
});
这是简化的例子,你需要注意滚动和细胞重用。