博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 数据优化之处理HTML字符串
阅读量:7197 次
发布时间:2019-06-29

本文共 2355 字,大约阅读时间需要 7 分钟。

最近项目遇到的问题,因为后台返回的数据是HTML字符串,所以就按照常规处理方式把HTML字符串转换成富文本的字符串来处理,事实证明,tableview会非常卡,并且造成线程阻塞,无法响应事件

在cell的model的set方法中刚开始是这样操作的~~~~~非常卡-(void)setModel:(XAPublicWelfareModel *)model{//这就是耗时操作的代码NSAttributedString * attrStr = [[NSAttributedString alloc]initWithData:[model.content dataUsingEncoding:NSUnicodeStringEncoding] options:@{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType} documentAttributes:nil error:nil]; self.introLabel.attributedText = attrStr;}复制代码

解决方案1.首先我想到的是把耗时操作放在子线程来操作

//1.获取一个全局串行队列    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//2.把任务添加到队列中执行    dispatch_async(queue, ^{                NSAttributedString * attrStr = [[NSAttributedString alloc]initWithData:[model.content dataUsingEncoding:NSUnicodeStringEncoding] options:@{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType} documentAttributes:nil error:nil];                dispatch_async(dispatch_get_main_queue(), ^{                        self.introLabel.attributedText = attrStr;                    });            });虽然解决了,卡屏,线程阻塞的问题,但是并没有解决根本问题,数据处理还是很慢,不建议使用复制代码

解决方案2. 因为是cell展示,所以只需要展示文本信息就行,那就过滤掉HTML标签,瞬间解决所有问题。所以在列表展示数据的时候HTML转换NSAttributedString一定要慎用

-(void)setModel:(XAPublicWelfareModel *)model{//调用去除HTML标签的方法,直接赋值。self.introLabel.text = [self filterHTML:model.content];}//去除标签的方法-(NSString *)filterHTML:(NSString *)html{    NSScanner * scanner = [NSScanner scannerWithString:html];    NSString * text = nil;    while([scanner isAtEnd]==NO)    {        [scanner scanUpToString:@"<" intoString:nil];        [scanner scanUpToString:@">" intoString:&text];        html = [html stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"%@>",text] withString:@""];        //去除空格          html = [html stringByReplacingOccurrencesOfString:@" " withString:@""];    }    return html;}复制代码

下面简单介绍一下NSScanner

NSScanner是一个类,用于在字符串中扫描指定的字符,翻译成我们需要的字符串或者数字,核心就是位置的移动 即scanLocation的移动变化

在上面的方法中首先指明了要扫描的对象 html(NSString) NSString * text 很重要 把我们要扫描出来的字符串存到text里面

而这个扫描到的字符串就是>之前的字符串 scanUpToString这个方法的意思是将scanLocation停留在>之前 并把之前的字符串传给text。

回头来看看我们去除html标签的方法 整个过程都是在扫描过程中进行的NSScanner在执行scanUpToString这个方法时一旦扫描到需要的字符串比如例子中的“<”,其scanLocation就会变为html的初始位置。所以,要在执行完一次完整的扫描后 把html标签用空字符串替换掉,在进行下一次扫描,也就是说再while中 html字符串的标签字符会越来越少,而每次扫描的初始位置相对没有变化都停留在上一次扫描结束的位置,即"<"标签的前面。

转载于:https://juejin.im/post/5a311bbd51882531b15b7e82

你可能感兴趣的文章
机器学习从入门到XX(五):神经网络模型
查看>>
技术存档:建站(二),升级https
查看>>
Linux中的阻塞机制及等待队列
查看>>
Redis编译安装
查看>>
Just for fun——Docker做个NMP环境
查看>>
我对JS字典的简单学习
查看>>
[译]HTML attribute与DOM property之间的区别?
查看>>
Payment:微信支付配置文件设置说明
查看>>
windows 下 Nginx + PHP 配置调试运行
查看>>
使用 Electron 打开外部链接或文件管理器
查看>>
Vue文档Template Syntax时想到的一个到另一个的问题
查看>>
MySQL · B+树并发控制机制的前世今生
查看>>
2018年最好的45个Vue开源项目汇总
查看>>
没有JS的前端:体积更小、速度更快!
查看>>
举重若轻的人人车移动端数据平台
查看>>
SHELL(bash)脚本编程六:执行流程
查看>>
AI一周热闻:周志华获IEEE技术成就奖;英伟达发布最小AI计算机
查看>>
NPM发布新的安全功能
查看>>
Java SE 12扩展Switch语句/表达式完整指南
查看>>
如何用Uber JVM Profiler等可视化工具监控Spark应用程序?
查看>>