2014-10-09 2 views
7

В iOS 8 (и бета-версии 8.1) производительность создания NSAttributedString намного хуже, чем 7 (2-3x). Это особенно заметно, если вы используете несколько экземпляров на одном и том же представлении, загрузка 4 разных меток приведет к задержке в течение секунды с момента нажатия пользователем и появления нового представления.Производительность NSAttributedString хуже в iOS 8

К сожалению, вы не можете даже выбросить это в другой поток, так как он использует WebKit за кулисами. Я представил ошибку Apple, но мне нужны идеи об обходных решениях или более эффективном подходе к внедрению.

В viewDidLoad:

self.labelOne.attributedText = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } 
                documentAttributes:nil 
                    error:&error]; 

Быстрый образец проекта: https://github.com/BenSS/AttributedStringTest

UPDATE:
iOS9 улучшает вещи снова, так что скорость не полностью парализует взаимодействие UI. К сожалению, все еще не так быстро, как это было в iOS7. (испытайте его сами с демо!)

ответ

5

В WWDC в этом году (2014) Я привнес эту игру в команду TextKit. В частности, я рассказывал о том, как некоторым из нас нужна поддержка асинхронного разбора HTML. Они были удивлены тем, что не существует публичного API для атрибутивного создания строки асинхронно.

Учитывая, что ядро ​​некоторых наших приложений связано с рендерингом большого количества текста в формате HTML, предоставляемый системой рендеринг не идеален даже на iOS 7. Поэтому мне сказали, чтобы он сделал ошибку; чем больше ошибок, связанных с этим вопросом, тем выше вероятность того, что Apple обратится к нему.

Мое предложение состоит в том, чтобы использовать DTCoreText, они обеспечивают именно то, что нам всем нужно по этой проблеме. Единственное другое решение - подождать.

+1

Это нелепо, что они пропустили плохую работу от этого до 8 лет, так как это было нормально до 7 лет. Спасибо за предложение DTCoreText, так как это хорошая остановка для наших нужд. – Ben

+0

Я знаю, я думаю, что ребята из Apple были невероятно трудными для iOS 8, и они выпустили тонну отличных API, но, к сожалению, некоторые вещи были пренебречь. Учитывая, сколько внимания было уделено текстовому набору, мы можем только надеяться, что это будет рассмотрено с помощью iOS 9 –

+0

@ DanielGalasko Любая идея, если бы это было? –

Смежные вопросы