UIView setNeedsDisplay Не в основной теме? - PullRequest
0 голосов
/ 21 марта 2011

В моем приложении для iPhone у меня есть дополнительный поток, который я создал для выполнения задач в фоновом режиме, и каждые несколько миллисекунд представление должно обновляться (не из основного потока).Я попробовал следующий код в моем подклассе UIView:

 [self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO];

Это прекрасно работает на симуляторе, однако на моем устройстве он очень медленный.Единственное, о чем я могу думать, это то, что основной поток забит обычными подпрограммами UIKit, что означает, что мой setNeedsDisplay вызывается намного позже, когда он должен (примерно на 1/2 секунды позже).Я думаю, что это потому, что в другом коде, основанном на взаимодействии с пользователем, я сразу вызываю setNeedsDisplay, и он работает нормально, без каких-либо задержек.Во вторичном потоке меньше внутренних вычислений, чем в потоке пользовательского интерфейса.Это приводит к очень плохим визуальным эффектам в моем приложении.

Итак, чтобы подвести итог, как я могу решить эту проблему?


ОБНОВЛЕНИЕ:

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

1 Ответ

3 голосов
/ 22 марта 2011

Если ваш пользовательский интерфейс сталкивается с таким сильным ударом, что ваш вызов слишком сильно задерживается, попробуйте немного обновить обновления пользовательского интерфейса и / или выполнить beginUpdate / endUpdate вокруг пакетов обновлений TableView (например,).

Я делаю что-то подобное в MonoTouch, и я не вижу никакого отставания такого масштаба. Все мои обновления сделаны из фоновых тем так же, как и ваше приложение.

В качестве альтернативы, если ваш основной пользовательский интерфейс может использовать больше процессорного времени, попробуйте уменьшить приоритеты фоновых потоков и посмотреть, поможет ли это.

...