Как я могу обновить основной график, не возвращаясь из метода?

StackOverflow https://stackoverflow.com/questions/1230030

Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top