7

iOS 8 (および 8.1 ベータ版) では、NSAttributedString を作成するパフォーマンスは 7 よりも大幅に低下します (2 ~ 3 倍)。これは、同じビューで複数のインスタンスを使用している場合に特に顕著です。4 つの異なるラベルを読み込むと、ユーザーがタップして新しいビューが表示されてから 1 秒以上の遅延が発生します。

残念ながら、裏で WebKit を使用しているため、これを別のスレッドに投げ込むことさえできません。Apple にバグを提出しましたが、回避策またはより良い実装方法についてのアイデアが必要です。

ビューでDidLoad:

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

簡単なサンプル プロジェクト: https://github.com/BenSS/AttributedStringTest

更新:
iOS9 では再び改善されているため、速度によって UI の操作が完全に損なわれることはありません。残念ながら、これはまだ iOS7 よりも高速ではありません。(デモで自分でテストしてください!)

4

1 に答える 1

5

今年 (2014 年) の WWDC で、私はこの振る舞いを TextKit チームに持ち出しました。具体的には、一部のユーザーが非同期 HTML 解析のサポートをどのように必要としているかについて詳しく説明していました。彼らは、属性付き文字列を非同期で作成するためのパブリック API がないことに驚いていました。

一部のアプリのコアが大量の HTML テキストのレンダリングを処理していることを考えると、システム提供のレンダリングは iOS 7 でも理想的とは言えません。そのため、バグを報告するように言われました。この問題に関して報告されたバグが多ければ多いほど、Apple がこの問題に対処する可能性が高くなります。

私の提案はDTCoreTextを使用することです。これらは、この問題に関して私たちが必要としているものを正確に提供します。他の唯一の解決策は、待つことです。

于 2014-10-09T15:10:24.300 に答える