Имейте в виду, что рисование происходит только в основном потоке, что означает, что во время работы drawRect:
весь ваш пользовательский интерфейс блокируется. Если этот код рисования медленный, то ваше приложение не будет отвечать на запросы во время рисования. Исходя из размера кода и количества отдельных операций рисования, которые вы выполняете в этом методе, похоже, что именно здесь и происходит.
drawRect:
получил свое название от того факта, что вы должны ограничить свой рисунок областью, описанной rect
. Из вашего вопроса не на 100% ясно, меняется ли каждый раз весь график или добавляется лишь немного новых данных. Если есть способ, которым вы можете реструктурировать свой код так, чтобы не нужно было каждый раз перерисовывать все это, это почти наверняка устранит ваши проблемы с рывками.
Например, вы также можете избежать рисования линий сетки при каждом обновлении, поместив их в отдельный вид за видом, который содержит график. Линии сетки (я полагаю) не нужно перерисовывать очень часто, поэтому, если вы сделаете вид графика прозрачным, UIKit объединит их для вас, и вы сможете избежать операции рисования. Возможно небольшая экономия, но все помогает. Это также означает, что вы можете стереть свое представление, заполнив его [UIColor clearColor]
. Рисование старого графика с цветом фона - чрезвычайно дорогая операция, но заливка прямоугольника очень дешева. Это меньше кода и он работает быстрее.
Если этого недостаточно, вы также можете сделать свой рисунок на отдельном UIImage
закадровом экране, а затем просто заменить содержимое вашего представления этим изображением. Это даст вам лучшую производительность, потому что вы сможете выполнять рисование изображения (которое является дорогой частью) в отдельном потоке, и поэтому операция рисования не будет блокировать основной поток приложения, что устранит рывки.