В июне 2016 года в App Store появилось разработанное нами приложение
Найдите отличия:
Капитан выходит на связь
Экран справа лагает. Это заметно по показателю загруженности CPU.
Разберёмся подробнее, в каких именно ситуациях снижается производительность. Для этого разобьём представление строки с символом валюты на составные части:
- текст может содержаться в следующих сущностях:
UILabel
,UITextView
иUITextField
; - в этих сущностях может использоваться обычная строка
NSString
и атрибутированнаяNSAttributedString
; - Для строки мы можем получить символ рубля одним из трёх способов:
- используя HTML:
- используя unicode:
- используя number formatter:
HTML
NSString *htmlString = @«<p>500 ₽</p> «;
self.string = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
unicode
self.string = [[NSAttributedString alloc] initWithString: @«500 \u20BD»];
number formatter
NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init]; [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; [numberFormatter setCurrencyCode:@«RUB»]; [numberFormatter setMaximumFractionDigits:0];
self.string = [[NSAttributedString alloc] initWithString:[numberFormatter stringFromNumber:@500]];
Комбинируя сущности, можно заметить, что производительность снижают следующие сочетания:
UILabel
, тип строки: attributed, методы получения символа: 2 или 3;UITextView
, тип строки: любой, методы получения символа: любой;UITextField
, тип строки: любой, методы получения символа: любой.
Эксперимент заключался в измерении нагрузки на процессор при пролистывании списка, элементы которого содержали символ рубля. Средняя нагрузка на процессор для нормального состояния не превышала 10%, а если была проблема, нагрузка
колебалась в районе 30–80%, что можно видеть на гифках.
На картинке обведены символы, с которыми наблюдается описанная проблема.
Чтобы приложение вело себя нормально, нужно избегать тех сочетаний, что выявили мы, или использовать для символов валют системный шрифт San Francisco, а также
шрифты из семейства Helvetica Neue. Но это минимальные требования. Истинная же причина увеличения нагрузки осталась загадкой.