Обмен между потоками не такой быстрый, а waitUntilDone:YES
добавляет дополнительные накладные расходы на синхронизацию потоков и совершенно не нужен (я уверен, что executeSelectors сериализуются). Возможно, вам повезет больше, если вы сделаете что-то вроде
-(void) progressAsynch{
for (count = 1; count<=100; count++) {
[self performSelectorOnMainThread:@selector(stuff) withObject:nil waitUntilDone:NO];
[NSThread sleepForTimeInterval:0.01];
}
}
Однако, это все еще плохо . Похоже, self
является контроллером представления или представления, который будет сохранен NSInvocation и предположительно выпущен в фоновом потоке. Большая часть UIKit не является потокобезопасной; код примера Game Center имеет длину great , чтобы указать, что классы UIKit даже не должны выпускаться в фоновых потоках, потому что выпуск может вызвать -dealloc
, что в классах UIKit может быть не поточно-ориентированным. (Уч.)
(Также обратите внимание, что ваш звонок на progressView.progress
небезопасен из фоновой цепочки.)
Вы также находитесь в пределе того, что возможно: я почти уверен, что временная привязка iOS составляет 10 мс, что означает, что если что-то еще требует ЦП в любой момент (и есть много фоновых процессов; попробуйте использовать Монитор активности в инструментах когда-нибудь) Ваша анимация может выглядеть запаздывающей.
Наконец, с некоторым кодом воспроизведения звука мы заметили, что NSTimer не очень точен. Я не уверен почему. Я думаю, что мы исправили это с помощью чего-то, что использовало SIGALRM (и код, который, вероятно, был небезопасен, вздох).
Возможно, вам повезет больше с CADisplayLink, который синхронизируется с частотой обновления экрана (я думаю, вы пропустите его [UIScreen mainScreen]
) и предназначен для использования анимациями, поэтому он должен работать немного лучше. iOS 3.1+, но я подозреваю, что нет смысла поддерживать 3.0.