2013-07-21 4 views
4

В первый раз становится первым зарегистрированным ответчиком, его называют медленным. Инструменты измеряют около 160 мс ... К тому времени, как это было сделано с загрузкой всего, что нужно было загрузить, чтобы клавиатура была на экране, клавиатура просто появляется! Убивает большую часть гладкой анимации.Как я могу ускорить getFirstResponder?

Второй раз, однако, он быстро вспыхивает! Это займет всего 2 мс!

Итак, могу ли я сделать это как-то?

+0

Что вы делаете, что принимает ваш 'startFirstponder', который принимает все время !? – bbum

+0

Я лично отметил, что клавиатура занимает дополнительное время, если у вас есть дополнительные клавиатуры, особенно emoji. Я тестировал фрейм клавиатуры с английскими, испанскими, японскими и emoji-клавиатурами, и я всегда замечал значительное замедление. – Can

+0

Отъезд @ Ответ Вадоффа здесь - http://stackoverflow.com/a/20436797/558575 – amergin

ответ

2

Использование НОД

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
// heavy lifting here 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [someTextField becomeFirstResponder]; 
    }); 
}); 

Это не было изначально работает, как ожидалось, но это было после применения НОД в какой-то «отмены», который происходит в фоновом режиме. В моем случае это был прокручиваемый вид

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
// heavy lifting here 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [_tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
    }); 
}); 
+3

Третья версия не делает ничего, кроме возможности задержать 'getFirstResponder', пока следующий проход не пройдет через цикл событий. Вся работа по-прежнему выполняется в основном потоке. Первое решение безумно хрупкое и уродливое. Второе решение кажется не решением; он, похоже, ничего не меняет. – bbum

+0

Третье решение гарантирует, что он работает асинхронно. Выполняя то же самое на подъеме, которое я делал на заднем плане, убедился, что никто из них не наступает навстречу. Результат был немного задержкой, да, но без ущерба для гладкости анимации. Я не мог предсказать время, необходимое для запуска функции startFirstResponder, поэтому это стало намного более элегантным решением. Я обновлю ответ и удалю решения 1 и 2. – nmdias

+1

Вы не можете запускать что-то асинхронно в основном потоке и * не блокировать или задерживать цикл событий *. Если он решает проблему, это происходит потому, что это делается в следующем проходе после тока через главный цикл событий; вы можете использовать 'dispatch_after()' с задержкой 0.0 или 'performSelector: withObject: afterDelay: 0.0 ...' и получить тот же результат без дополнительной блокировки блока. (И, если это действительно исправляет проблему, то ... аккуратно! Отмечено!) – bbum

Смежные вопросы