#objective-c #cocoa #core-plot
#цель-c #какао #core-plot
Вопрос:
У меня есть диаграмма рассеяния, созданная с использованием Core Plot (версия 1.5). Источником данных является словарь, содержащий (x, y, значение). Мне нравится иметь возможность динамически настраивать количество пар (x, y) для построения. Однако мой graphHostingView не обновляет диаграмму рассеяния после изменения количества пар (x, y), содержащихся в источнике данных, пока я не изменю размер окна. Когда я изменяю размер окна, новые значения загружаются и отображаются. Я попробовал несколько решений, в том числе:
[graph reloadData]
[scatterplotview setNeedsDisplay:YES]
- Принудительный вызов:
[self.myScatterPlot.plotItem renderInView:self.myScatterPlot.hostingView withTheme:nil animated:NO withData:nil];
Безуспешно. Может ли кто-нибудь предложить метод, который позволил бы динамически обновлять мою диаграмму рассеяния при изменении значений или отправить мне ссылку на пример? Заранее спасибо. Приветствую, Тронд
Ответ №1:
Существует несколько доступных методов, чтобы сообщить базовому графику, что у вас есть новые доступные данные:
-reloadData
: Заменить все данные графика новыми точками данных. Вызов этого метода на графике приводит к тому, что все графики в графике перезагружают свои данные.-reloadDataInIndexRange:
: Замените данные графика в заданном диапазоне индексов новыми значениями, оставив точки за пределами этого диапазона нетронутыми.-insertDataAtIndex:numberOfRecords:
: Вставить новые точки данных с заданным индексом, при необходимости переместив существующие точки данных на более высокие индексы.-deleteDataInIndexRange:
: Удалите существующие данные в заданном диапазоне и переместите существующие точки данных, чтобы закрыть пробел.
Демонстрация «Графика в реальном времени» в приложении Plot Gallery example использует эти методы для обновления своих данных. В демонстрации используется таймер для генерации случайных данных графика, но ваши новые данные могут поступать откуда угодно.
Комментарии:
1. Спасибо за ваш ответ, Эрик. Я изучил пример «Графика в реальном времени», и теперь я заставляю его работать, используя reloadData. Тем не менее, требуется около 5-10 секунд от обновления данных, которые я хочу отобразить, до фактического отображения новых данных (5-50 точек рассеяния). Это почти как приостановка построения графика до тех пор, пока не будет достигнут некоторый триггер. Знаете ли вы, что это может быть, или есть ли способ заставить runloop немедленно перерисовать? T.
2. Все методы, о которых я упоминал, заставляют график перерисовываться в следующий раз в течение основного цикла рендеринга анимации. Убедитесь, что вы вызываете их из основного потока и что вашему источнику данных не требуется много времени для обработки данных, прежде чем возвращать их на график. Любая предварительная обработка должна быть выполнена до того, как вы сообщите графику (с помощью вышеуказанных методов), что доступны новые данные.
3. Оказалось, что я вызвал метод из потока, отличного от основного потока. Переход на основной поток решил мою проблему. Спасибо!