2014-10-09 12 views
7

Unter iOS 8 (und 8.1 Beta) ist die Leistung der Erstellung eines NSAttributedString viel schlechter als 7 (2-3x). Dies ist besonders auffällig, wenn Sie mehrere Instanzen in derselben Ansicht verwenden. Das Laden von vier verschiedenen Labels führt zu einer Verzögerung von mehr als einer Sekunde, wenn der Benutzer auf die neue Ansicht klickt.NSAtributedString Leistung ist schlechter unter iOS 8

Leider kann man dies nicht einmal in einen anderen Thread werfen, da es hinter den Kulissen WebKit verwendet. Ich habe Apple einen Fehler gemeldet, brauche aber Ideen zu Workarounds oder einen besseren Implementierungsansatz.

In viewDidLoad:

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

Schnellbeispielprojekt: https://github.com/BenSS/AttributedStringTest

UPDATE:
iOS9 verbessert wieder Dinge, so ist die Geschwindigkeit nicht vollständig lähmende die UI-Interaktion. Leider ist es immer noch nicht so schnell wie unter iOS7. (Testen Sie es selbst mit der Demo!)

Antwort

5

Auf der WWDC dieses Jahr (2014) brachte ich dieses Verhalten mit dem TextKit-Team. Insbesondere habe ich ausgearbeitet, wie einige von uns Unterstützung für das asynchrone HTML-Parsing benötigen. Sie waren überrascht, dass es keine öffentliche API für die attributierte String-Erstellung asynchron gibt.

Angesichts der Tatsache, dass der Kern einiger unserer Apps mit der Wiedergabe großer Mengen von HTML-Text zu tun hat, war das System Rendering weniger als ideal, auch auf iOS 7. So wurde ich aufgefordert, einen Fehler zu archivieren; Je mehr Fehler zu diesem Problem gemeldet werden, desto höher ist die Wahrscheinlichkeit, dass Apple sie anspricht.

Mein Vorschlag ist zu verwenden DTCoreText, sie bieten genau das, was wir alle in Bezug auf dieses Problem benötigen. Die einzige andere Lösung ist zu warten.

+1

Es ist lächerlich, dass sie die schlechte Leistung dieser unter 8 verpasst haben, da es unter 7 gut war. Danke für den DTCoreText Vorschlag, da das eine gute Notlösung für unsere Bedürfnisse auch ist. – Ben

+0

Ich weiß, ich denke, die Jungs von Apple wurden unglaublich hart für iOS 8 gedrängt und sie haben eine Menge toller APIs veröffentlicht, aber leider wurden einige Dinge vernachlässigt. Angesichts der Tatsache, wie viel Wert auf Text-Kit gelegt wurde, können wir nur hoffen, dass dies mit iOS 9 –

+0

@DanielGalasko adressiert wird. Irgendeine Idee, wenn es war? –