html 视频列表渲染慢,NSAttributedString中的HTML渲染非常慢

我有UITableView和动态大小调整单元格,以HTML格式显示评论列表,我遇到的问题是NSAttributedString渲染HTML内容非常慢!

这是分析器的快照.

VK9L3.png

我试图将NSAttributedString初始化放到单独的线程中,但仍然很慢并且用户在呈现HTML时看到空单元格,最后在完成呈现单元格时,布局不正确.

dispatch_async(GlobalQueue, {

let html = NSAttributedString(

data: self.comment.htmlBody.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: false)!,

options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],

documentAttributes: nil,

error: nil)

dispatch_async(MainQueue, {

self.commentLabel.attributedText = html

self.commentLabel.font = UIFont(name: "HelveticaNeue-Light", size: 14.0)!

if let writer = self.comment.author {

self.authorLabel.text = writer.name

}

self.layoutIfNeeded()

})

})

看起来如下

FqLyp.png

请建议如何加快渲染和修复单元格布局.

谢谢!

更新:

使用单元格委托和标志解决,表明属性字符串已初始化.也许会帮助某人:

// TicketCell

private var isContentInitialized = false

private var commentAttributedString:NSAttributedString?

var delegate: TicketCommentCellDelegate?

var indexPath: NSIndexPath!

var comment: TicketComment! {

willSet {

if newValue != self.comment {

self.isContentInitialized = false

}

}

didSet{

self.configure()

}

}

...

private func configure() {

if isContentInitialized {

// here might be activity indicator stop

...

if let writer = self.comment.author {

self.authorLabel.text = writer.name

}

}

else {

// here might be activity indicator start

dispatch_async(GlobalQueue, {

self.commentAttributedString = NSAttributedString(

data: self.comment.htmlBody.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: false)!,

options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],

documentAttributes: nil,

error: nil)

self.isContentInitialized = true

// here might be spinner stop

dispatch_async(MainQueue, {

self.delegate?.ticketCommentCellDidRenderCommentHTML(self)

})

})

}

}

...

protocol TicketCommentCellDelegate {

func ticketCommentCellDidRenderCommentHTML(cell: TicketCommentCell)

}

// TableViewDataSource

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCellWithIdentifier(kTicketCommentCellIdentifier, forIndexPath: indexPath) as! TicketCommentCell

cell.indexPath = indexPath

cell.delegate = self

cell.comment = self.rows[indexPath.section][indexPath.row]

return cell

}

// MARK: - TicketCommentCellDelegate

func ticketCommentCellDidRenderCommentHTML(cell: TicketCommentCell) {

self.tableView.reloadRowsAtIndexPaths([cell.indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)

}

// MARK: UITableViewDelegate

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

var cell = self.commentCell

cell.comment = self.rows[indexPath.section][indexPath.row]

cell.setNeedsDisplay()

cell.setNeedsLayout()

let height = cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height + 1

return height

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值