iOS首页渲染优化 -- imageName:

针对iOS APP中的UITabBarItem渲染图片导致的白屏问题,通过分析发现imageName:方法在主线程解码图片耗时较长,采取异步解码策略显著提升渲染效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

前言

随着APP功能的逐渐强大和业务上的逐渐完善,目前对于iOS开发者来说,对于APP的优化逐渐显得尤为重要,本篇基于APP渲染优化上探讨一下imageName:的爱恨情仇,下面以UITabBarItem渲染图片为例,一步步以实践的方式进行分析。

分析

首先看下未优化前的效果图:

测试设备:iPhone7 ,系统:12.1

1.gif

细心的同学应该能够发现,在登录进入首页,到首页渲染结束,中间会有一段白屏,为什么会白屏一会而没有马上渲染首页呢,第一感觉肯定是这中间形成主线程阻塞了,让UI没有立即渲染出来,其实事实上确实是这样,那接下来我们通过Instruments分析一下哪里执行了耗时操作以至于首页渲染被阻塞了。Instruments里面有个工具TimeProfiler,可以用来帮我们查看哪里有耗时操作。关于这个工具的使用和配置网上很多介绍本篇不做重点分析了,我直接粘调试的图片了。

2.webp.jpg

通过TimeProfiler的结果一目了然,在CustomTabBarItem里面做了什么用了387ms。可以在工具里面直接右键进入到到这段耗时代码的位置。我总共测试了五个tabbar渲染item图片的耗时:

3.webp.jpg

4.webp.jpg

看打点日志就很恐怖了,执行两个imageName:就消耗了主线程差不多100ms的时间,五个tabbar那就是500ms的时间,显然这就是上面效果图出现白屏的原因了,实际上imageName:是会对图片进行解码之后再渲染的。

既然原因找到了,那就尝试解决一下。将这个耗时的操作放到子线程执行,这里也是参考了SDWebImage的图片编解码的思路,SD在拿到图片data的时候并没有将它直接转为image对象,而是在子线程里面做了一个解码的操作,这样已经被解码的图片就赋值给imageView的时候就不会再进行解码,也就不会妨碍主线程了。

- (void)decodedImageWithImageName:(NSString *)imageName block:(void(^)(UIImage *image))block {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        @autoreleasepool{
            UIImage *image = [[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
            image = [UIImage decodedImageWithImage:image];
            dispatch_async(dispatch_get_main_queue(), ^{
                if(block)
                block(image);
            });
        }
    });
}

 

代码实现很简单,就是将图片的操作放入到一个全局队列中,当然也可以自己创建一个队列去执行这个异步操作。decodedImageWithImage:为SD的代码,需要#import "SDWebImageDecoder.h",具体实现网上对这一块的源码解释的比较多,很容易理解。

这样我们的图片经过这层处理之后,我们再来看一下优化之后的效果:

5.webp.jpg从总计500ms降到了6ms,基本可以忽略不及了,我们再在真机上面看一下优化后的效果:

6.gif

经过同事的提醒和评论区小伙伴的质疑,我又重新测试了一下imageName:的加载耗时,得到一种现象,如果将图片资源放入在文件目录中,每张图片第一次加载依旧耗时大概30ms左右,因为imageName:方法对图片有缓存,所以测试多次加载需要多张不同的图片进行测试。另外我将测试图片放入Assets.xcassets中每张图片加载耗时大概在1ms左右,猜测Assets.xcassets提前将图片做了缓存。

测试图片:

7.webp.jpg

总结

通过上面的分析,实际上imageName:这样的UI函数我们天天都在用,但是从没想过它在某些地方能产生这么大的影响。问题的定位和解决其实都很简单,但是这种简单的问题往往会被我们开发者忽略掉,产生一些不好的结果,值得反思。

转载于:https://www.cnblogs.com/ruixin-jia/p/10154312.html

<think>我们参考引用[3]中提到的命令格式:`tesseract --list-langs` 可以列出已安装的语言包。 根据用户上一次的问题,用户可能想查看Tesseract支持的语言列表,但之前误用了参数导致显示帮助信息。 因此,正确的命令是:`tesseract --list-langs` 但是,请注意: 1. 该命令会列出已经安装的语言包,而不是所有支持的语言(因为可能没有安装全部语言包)。 2. 要查看所有可用的语言包(在Arch Linux上)可以使用`pacman -Ss tesseract-data`(引用[2]),在其他系统上可以使用相应的包管理命令。 因此,回答应该包括: - 如何列出已安装的语言包(使用`tesseract --list-langs`) - 如何查看系统上可用的语言包(根据不同的操作系统) 另外,引用[1]提到如果遇到问题可以先查阅文档和FAQ,然后搜索用户论坛等。 根据引用[3],我们还可以看到`tesseract`命令的一些其他选项,比如`--tessdata-dir`可以指定语言包路径。 所以,我们可以这样回答: 要查看Tesseract OCR已安装的语言包,请使用以下命令: ``` tesseract --list-langs ``` 要查看系统上可用的Tesseract语言包(即可以安装的),请根据您的操作系统使用相应的包管理命令: - 在Arch Linux上:`pacman -Ss tesseract-data` - 在Debian/Ubuntu上:`apt search tesseract-ocr-` - 在Fedora上:`dnf list tesseract-langpack-*` 如果您需要安装新的语言包,例如中文简体,在Ubuntu上可以安装`tesseract-ocr-chi-sim`,在Arch Linux上可以安装`tesseract-data-chi_sim`。 注意:语言包的命名可能因系统而异,通常使用ISO 639-1或ISO 639-3代码。例如,简体中文为`chi_sim`(引用[3]中已安装的语言包列表中有`chi_sim`)。 如果命令`tesseract --list-langs`返回的语言列表为空或缺少预期语言,请确保已安装相应的语言包。 另外,如果您的语言包不在默认路径,可以使用`--tessdata-dir`选项指定语言包目录,例如: ``` tesseract --tessdata-dir /path/to/your/tessdata --list-langs ``` 最后,如果遇到问题,请参考Tesseract文档和FAQ(引用[1])。 根据以上分析,我们生成相关问题: 相关问题: 1. 如何在Windows上安装Tesseract语言包? 2. Tesseract支持哪些语言? 3. 如何下载Tesseract语言包并手动安装? 4. 如何设置Tesseract的语言包路径? 注意:在回答中,我们不需要显示引用标识,因为用户没有要求,但我们在回答中提及了引用中的信息(如命令),所以我们在末尾添加引用标识[^1][^2][^3]。</think>要查看Tesseract OCR支持的语言列表,请使用以下命令(基于引用[3]的说明): ### 正确命令 ```bash tesseract --list-langs ``` ### 使用示例 ```bash $ tesseract --list-langs List of available languages (3): eng chi_sim jpn ``` ### 关键说明 1. **已安装语言**:该命令显示的是**实际已安装**的语言包,而非所有支持的语言(引用[3]) 2. **语言包安装**: - 在Arch Linux:`pacman -Ss tesseract-data` 查看可用语言包(引用[2]) - 在Ubuntu/Debian:`apt search tesseract-ocr-` 3. **指定语言路径**:若语言包不在默认位置,需添加参数: ```bash tesseract --tessdata-dir /custom/path --list-langs ``` ### 常见问题解决 1. **无输出/报错** → 可能未安装语言包: ```bash # Ubuntu示例:安装简体中文包 sudo apt install tesseract-ocr-chi-sim ``` 2. **语言代码规范**:使用ISO 639 3字母代码(如`chi_sim`=简体中文)(引用[2]) > Tesseract最初由HP开发,后由Google维护改进,支持语言包持续扩展(引用[4])。遇到问题可查阅官方文档和用户论坛(引用[1])。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值