1.相信用iOS系统的类去加载html字符串很多人第一反应就是

NSString *contens = @"1231我给你数<a herf="www.baidu.com">点这里</a>";
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)];//回主线程刷新uidispatch_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

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

  1. ios html字符串 label,iOS UIlabel怎么加载html字符串 富文本的用法

    要加载html字符串,用人说,直接用webView啊!但是,有时候我们只需要显示2行文字,如此少的内容却要在复杂的UI排版中加入一个占用资源较多的webview,得不偿失.这里要说的是,我们其实可以用 ...

  2. IOS 类似抖音下拉刷新与自定义上拉加载

    IOS 类似抖音下拉刷新与自定义上拉加载 最近UICollectionView中使用了pageEnabled,MJRresh直接使用时出现偏移.这里就暂时考虑简单的做法. 首先考虑在UICollect ...

  3. 带有框架的iOS应用在设备上崩溃,dyld:库未加载,Xcode 6 Beta

    本文翻译自:iOS app with framework crashed on device, dyld: Library not loaded, Xcode 6 Beta This crash ha ...

  4. iOS之深入解析类加载的底层原理:类如何加载到内存中

    一.App 启动与 dylb 加载 App 启动会由 libdyld.dylib 库先于 main 函数调用 start,执行 _dyld_start 方法,然后运用汇编实现调用 dyldbootst ...

  5. [iOS] 引用外部静态库时,(类别)目录方法无法加载问题

    [iOS] 引用外部静态库时,目录方法无法加载问题 这个 bug 在 xcode 4.3 以下会出现,4.3 以后已经修正了. 解决方法为:找到 target 的图标,更改其 Other Linker ...

  6. 如何在iOS 9中启用“应用程序传输安全性”的情况下加载HTTP URL? [重复]

    本文翻译自:How do I load an HTTP URL with App Transport Security enabled in iOS 9? [duplicate] This quest ...

  7. iOS之深入解析类加载的底层原理:分类如何加载到类以及分类和类的配合使用

    一.分类的本质 ① Xcode Documentation 通过 Xcode 文档搜索,在 Documentation 搜索 Category 关键字: 点击 Category ,如下: ② 通过 o ...

  8. iOS之支持https与ssl双向验证(包含:解决UIWebView加载不了https网页的图片,css,js等外部资源)

    http://blog.csdn.net/luochuanad/article/details/53410537

  9. html5默认加载s文件夹,『总结』web前端开发常用代码整理

    IE条件注释 条件注释简介 IE中的条件注释(Conditional comments)对IE的版本和IE非IE有优秀的区分能力,是WEB设计中常用的hack方法. 条件注释只能用于IE5以上,IE1 ...

最新文章

  1. Shell脚本基础介绍
  2. android记事本添加图片功能,安卓手机上有什么便签app既可以写日记又可以添加照片?...
  3. Google谷歌通过地址计算两地距离 HOW TO CALCULATE DRIVING DISTANCE BETWEEN 2 LOCATIONS
  4. 从苹果 M1 看芯片技术发展趋势
  5. 尝试造了个工具类库,名为 Diana
  6. 计算机的指令格式通常是由两部分组成,计算机指令由两部分组成,它们是什么...
  7. (Unity)太空大战笔记
  8. MyBatis学习之一
  9. 最新python面试题180题完整版带答案(转载加整理)
  10. ORAN C平面 Section Extension 8
  11. WechatSpellbook学习笔记
  12. 网络:以太网交换机、路由器
  13. BugkuCTF-MISC-图穷匕见
  14. 计算机专业中国十大名校最新排名,中国最顶尖的十所大学 中国十大名校排名...
  15. 768位RSA算法遭破解,1024位目前安全
  16. xm-select下拉框,下拉树
  17. 婚宴座位图html5,婚礼座位安排必须注意的15个细节
  18. 强大的录屏工具:Screen Recorder by Omi Mac
  19. 如何快速查询笔记本序列号
  20. 软件工程:软件工程过程与方法

热门文章

  1. java打字训练课程设计_Java打字训练课程设计
  2. jpa 原生sql 查询返回一个实体_JPA查询--使用原生sql 并且把查询结果转为实体对象...
  3. java 微信 jssdk 分享朋友圈_微信JS-sdk分享到朋友圈无效
  4. 计算机视觉算法岗面经,2019秋招资料
  5. 快手活跃用户预测_哈工大团队解决方案
  6. 结构体可以整体交换吗_结构胶能够耐高温吗?可以在高温环境中工作吗?好用吗?...
  7. 艺术字计算机学院,最新职称计算机考试Word2003操作题:艺术字
  8. java docker 持续集成_最佳实战Docker持续集成图文详解
  9. mysql中日期相减_MySQL环境配置和10分钟快速入门
  10. shell 按文件每行长度排序