富文本转html字符串

/**

* 富文本转html字符串

*/

+ (NSString *)attriToStrWithAttri:(NSAttributedString *)attri{

NSDictionary *tempDic = @{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,

NSCharacterEncodingDocumentAttribute:[NSNumber numberWithInt:NSUTF8StringEncoding]};

NSData *htmlData = [attri dataFromRange:NSMakeRange(0, attri.length)

documentAttributes:tempDic

error:nil];

return [[NSString alloc] initWithData:htmlData

encoding:NSUTF8StringEncoding];

}

字符串转富文本

/**

* 字符串转富文本

*/

+ (NSAttributedString *)strToAttriWithStr:(NSString *)htmlStr{

return [[NSAttributedString alloc] initWithData:[htmlStr dataUsingEncoding:NSUnicodeStringEncoding]

options:@{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType}

documentAttributes:nil

error:nil];

}

最近项目遇到的问题,因为后台返回的数据是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:@"

[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这个方法时一旦扫描到需要的字符串比如例子中的“

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐