ios整理(六)关于用富文本在tableview的cell去加载html字符串的优化方案

简介: ios整理(六)关于用富文本在tableview的cell去加载html字符串的优化方案1.相信用iOS系统的类去加载html字符串很多人第一反应就是NSString *contens = @"1231我给你数点这里";NSData *data = [contens dataUsingEncod...

ios整理(六)关于用富文本在tableview的cell去加载html字符串的优化方案
1.相信用iOS系统的类去加载html字符串很多人第一反应就是

NSString *contens = @"1231我给你数点这里";
NSData *data = [contens dataUsingEncoding:NSUnicodeStringEncoding];
NSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};
NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithData:data options:options documentAttributes:nil error:nil];
然后后面的就是直接将attr这个对象赋值给lab或者textView这样的控件就能展示了,苹果提供的API就是这个。

然而我要说的是在反复的intiWithData的时候它是比较耗费内存性能的,你可以尝试的去把他放在tableview里面的cell去加载,你会发现滚动起来后通过cell复用机制去加载会使UI界面变得卡顿,那么为什么会造成这种原因呢?通过反复的去验证,我发现反复的intiWithData确实挺爆内存的,后来就找原因。

网上也看过别人写的一个优化的方案,很直接的就是你可以异步开辟子线程去加载这个attr然后在主线程去赋值,这样就可以了。

复制代码
// 获取全局并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 获取主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(queue, ^{

contents = [contents stringByReplacingOccurrencesOfString:@"\n" withString:@"<br>"];
NSData *data = [content dataUsingEncoding:NSUnicodeStringEncoding];
NSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};
NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithData:data options:options documentAttributes:nil error:nil];
[attr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:17] range:NSMakeRange(0, attr.length)];
//回主线程刷新ui
dispatch_async(mainQueue, ^{
     //给UI控件赋值
     self.lab.attr = attr;
});

});
复制代码
类似于这种,可以减少内存使用率让UI不卡顿。但是这种情况下你要考虑是否适合当前的场景,例如你创建的这个cell是根据富文本里面的高度去计算的,那么你就得仔细考虑一下了,上面这段代码是通过异步进行加载的,那么的话你要计算出高度的话就得异步去拿高度,但是当异步拿到高度的时候你cell很有可能已经创建完了,时机没办法同步。而且当你高度拿到后再进行reloadData刷新的话,那么整个tableview是会重新布局的,那么又会去重新计算,这样会出现闪屏的现象,那么废话说了那么,原因就是因为它加载的时候转换的contens内容不多或者只initWithData一两次还好,但是cell的滚动复用会让他多次加载,因此不能放在cell创建的时候去执行。

下面是我个人的思路,有其他想法的可以提出来一起交流:

1.如果cell里面加载会反复执行这段代码的话,就会消耗内存及卡顿UI,那么我在cell创建前提前做好这个事情,让他不需要initWithData多次。

在模型的.h里面创建attr属性

@interface TestModel : NSObject
@property (strong,nonatomic) NSMutableAttributedString *attr;
@end
在.m里去做刚才的这一步,那么就是说当请求数据结束后再进行富文本的转换在赋值给模型保存,而不是创建cell的时候去加载富文本

复制代码

  • (instancetype)initModelWithDict:(NSDictionary *)dict {
    //初始化
    id obj = [[self alloc] init];
    //字典转模型
    [obj setValuesForKeysWithDictionary:dict];
    //转富文本
    if (contens) {

    NSData *data = [contens dataUsingEncoding:NSUnicodeStringEncoding];
    NSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};
    NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithData:data options:options documentAttributes:nil error:nil];
    [attr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:17] range:NSMakeRange(0, attr.length)];
    model.attr = attr;

    }
    return obj;
    }

复制代码
那么,模型走完这一步再去刷新reloadData 那么cell加载的时候就可以直接将model里的attr给cell里面的lab或者textView控件的attr就行了,每次就是从模型里面去取值,这样性能就会好点。

后面要计算高度可以冲模型里面取到attr对象,然后根据lab或者textView调用系统的计算布局就行,下面的经供参考

CGFloat labH = [self.lab boundingRectWithSize:CGSizeMake(375, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attr context:nil].size.height;
原文地址https://www.cnblogs.com/wm941142146/p/10653266.html

相关文章
|
3月前
|
存储 安全 JavaScript
如何安全的渲染HTML字符串?
如何安全的渲染HTML字符串?
|
5月前
|
移动开发 小程序 JavaScript
小程序中加载html5地图界面链接
小程序中加载html5地图界面链接
58 0
|
6月前
|
Web App开发 数据安全/隐私保护 iOS开发
app优化ios,iOS app上架流程问题集锦,ASO新手小白必看(上)
app优化ios,iOS app上架流程问题集锦,ASO新手小白必看(上)
|
2月前
|
前端开发 JavaScript 安全
react如何渲染包含html标签元素的字符串
react如何渲染包含html标签元素的字符串
57 0
|
3月前
|
监控 Linux iOS开发
如何使用克魔开发助手优化iOS应用性能
如何使用克魔开发助手优化iOS应用性能
32 1
|
3月前
|
安全 Java Android开发
iOS代码安全加固利器:深入探讨字符串和代码混淆器的作用
iOS代码安全加固利器:深入探讨字符串和代码混淆器的作用
35 0
|
4月前
|
安全 Java Android开发
iOS代码安全加固利器:深入探讨字符串和代码混淆器的作用
在网上搜“代码混淆”关键词,可以看到n多教程。包括本篇博客,大部分重要内容也是从网上各位大神的博客里面看到然后摘取和总结出来的。虽然网上都有,但是对于我个人来说,很难找到一篇博客概括完全的,所以还是总结一下,也算是学习的纪录。
|
4月前
|
前端开发 Windows
HTML+CSS制作Windows启动加载动画
HTML+CSS制作Windows启动加载动画
|
6月前
|
iOS开发 MacOS
iOS指定加载任意语言
iOS指定加载任意语言
46 2
|
7月前
|
Web App开发 前端开发 JavaScript
SAP UI5 应用 index.html 里定义的 data-sap-ui-theme 值的加载原理
SAP UI5 应用 index.html 里定义的 data-sap-ui-theme 值的加载原理
39 0