Какой самый простой и быстрый способ обмениваться сообщениями с 30 объектами одновременно? - PullRequest
0 голосов
/ 30 мая 2009

У меня есть UIScrollView, где появляется много объектов (UIImageView) во время прокрутки. Однако, когда пользователь прокручивает, я хочу отправить сообщения всем этим объектам, чтобы сказать им, что они не должны делать глупостей. Когда UIScrollView замедляется, некоторые анимации происходят на видимых объектах. Когда пользователь движется быстро (pagingEnabled = YES), все больше и больше объектов по-прежнему анимируются, что приводит к ужасной производительности прокрутки.

Я хочу сказать им всем, чтобы они немедленно прекратили и ничего не делали, как только пользователь прокручивает. Так что я могу сделать? Цикл for ухудшает производительность при прокрутке. Это немного подействует, но этого достаточно, чтобы очень сильно разозлить пользователя.

Ответы [ 4 ]

4 голосов
/ 30 мая 2009

Поместите их все в массив и используйте [NSArray makeObjectsPerformSelector:]. Это самый краткий способ сделать это, но я не уверен, что это эффективнее, чем использование цикла for ...

Я не уверен, как вы анимируете свои представления, но вы можете использовать функции делегатов UIScrollView, чтобы поддерживать подмассив видимых элементов и ограничивать анимацию ими. Например, всякий раз, когда видимый прямоугольник изменяется, вы можете просмотреть свой существующий список видимых представлений и посмотреть, есть ли какие-либо полностью за кадром. Вы можете перестать оживлять их. После этого вы можете искать представления, которые были на экране, но отсутствуют в списке, и запускать на них анимацию. Я делал что-то подобное раньше, и это помогло существенно улучшить производительность!

Тогда, если вы хотите заморозить все запущенные анимации, у вас есть массив анимационных анимаций, и он относительно короткий.

Надеюсь, это поможет!

2 голосов
/ 31 мая 2009

Я бы использовал уведомления. Это имеет то преимущество, что вы можете уведомить все ваши объекты, передавая им всю необходимую информацию. Это также простой, но мощный механизм, обеспечивающий асинхронную связь.

См. Введение в темы программирования уведомлений:

http://developer.apple.com/documentation/Cocoa/Conceptual/Notifications/Introduction/introNotifications.html

2 голосов
/ 31 мая 2009

Также помните, что компьютеры могут делать вещи только линейно. Поэтому независимо от того, что вы делаете, вам придется использовать какую-то структуру управления циклами.

возможно, запустить поток, содержащий цикл. и цикл вызовет

perfomrselectoronmainthread:

селектор для каждого объекта. (помните, что для пользовательского интерфейса это должно выполняться в главном потоке.)

и я полагаю, вы используете

+ (void)setAnimationsEnabled:(BOOL)enabled

Чтобы остановить анимацию.

Если это все еще не достаточно быстро, вам придется взглянуть на Core Animations, они будут иметь дополнительную эффективность, которая позволит этому произойти.

1 голос
/ 31 мая 2009

Попробуйте выполнить каждое сообщение в другой теме. Конечно, все обновления пользовательского интерфейса должны быть в основном потоке, но если вы можете выполнить некоторую работу в фоновом потоке, возможно, это уменьшит некоторое отставание. (Однако я не могу сказать, насколько это возможно для 30+ объектов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...