Как я могу обновить основной график, не возвращаясь из метода? - PullRequest
0 голосов
/ 05 августа 2009

У меня есть интерфейс какао, который использует основной сюжет. Когда я нажимаю кнопку в интерфейсе, сюжет рисуется. Я хотел создать последовательность графиков, вызывая метод построения графика несколько раз вместе с вызовами sleep () между ними. Но, похоже, что даже при вызове перезагрузки данных ничего не происходит до тех пор, пока функция не выйдет (также отображается только последний график). Теперь я знаю, что CPAnimation существует, но прежде чем я начал его использовать, мне было интересно, что же происходит при выходе из функции, которая заставляет график обновляться. Придется ли мне уступать потоку, который заботится об обновлении, вместо использования sleep?

Ответы [ 4 ]

3 голосов
/ 05 августа 2009

Хорошо, я понял, как. Я вызвал метод reloadData из метода в отдельном потоке (который всегда возвращает). Это сводилось к вызову reloadData из IBAction, а также с помощью NSTimer. Наконец, вместо использования сна я буду использовать NSConditionLock координировать обработку и обновление

2 голосов
/ 07 августа 2009

График ядра, как и большинство структур рисования Какао, ленив: он рисует в конце итерации цикла выполнения. Это сделано для того, чтобы вещи не рисовались слишком часто.

Вместо того, чтобы рисовать сразу, слои помечаются как нуждающиеся в рисовании.

Как отмечалось другими, лучший подход к сну - использовать NSTimer, чтобы избежать блокировки цикла выполнения, или использовать методы NSObject, такие как executeSelector: withObject: afterDelay:

2 голосов
/ 05 августа 2009

Предположительно, Core Plot (или ваш код) устанавливает представление как нуждающееся в отображении. Это происходит не сразу; это происходит, когда вы возвращаетесь в цикл обработки событий.

Всякий раз, когда вы используете sleep в приложении Mac OS X, вы убиваете щенка. Вместо этого используйте NSTimer. Сделайте так, чтобы ваш метод обратного вызова таймера выполнил работу, требуемую для одного графика, и установите переменные экземпляра, необходимые для того, чтобы ваш метод знал, какой график он должен нарисовать, чтобы метод рисовал каждый график по очереди, пока у него не закончится. *

Или, еще лучше, представить список графиков, из которых пользователь может выбирать, вместо того, чтобы заставлять пользователя просматривать все графики в виде слайд-шоу. (Если вы реализуете явно обозначенное слайд-шоу.)

0 голосов
/ 05 августа 2009

Питер правильно понял - метод перезагрузки данных на самом деле ничего не рисует. График помечается как требующий отображения и обновляется при следующем отображении слоев на экране. Если вы используете sleep, у него никогда не будет шанса на рисование.

Также обратите внимание, что Core Plot - довольно молодой проект; CPAnimation и связанные классы являются заглушками. Они еще ничего не делают. : -)

...