2014-10-07 4 views
2

Я пытаюсь лучше понять эту тему. Допустим, я хочу сделать некоторые действительно прохладно анимации, как следующийПонимание блока анимации iOS UIView и блока dispatch_async (dispatch_get_main_queue)

- (void)coolAnimation 
{ 
    [UIView animateWithDuration: some duration 
        animations:^{ some animation }]; 
} 

С момента своего анимационного блока, она автоматически добавляется в main_queue? Или для лучшей практики я всегда должен добавлять обновления пользовательского интерфейса в main_queue следующим образом.

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self coolAnimation]; 
}); 

ответ

8

Содержимое вашего блока выполняется в основном потоке независимо от того, где вы звоните [UIView animateWithDuration:animations:]. Лучше всего позволить ОС запускать анимацию; поток анимации не блокирует основной поток - только сам блок анимации.

В очень высокоуровневом ручном виде этого вида [UIView animateWithDuration:animations:] оценивает ваш блок и определяет функции для каждого анимационного значения внутри него. У ОС есть поток анимации, который он использует в качестве таймера кадра, а затем при каждом тике он отправляет обновление основного потока вашим анимационным свойствам с их прогрессивными значениями. (Вы можете проверить текущее состояние этих значений на вашем презентационном слое.)

1

Блок анимации вы передаете называется сразу. Не нужно использовать какие-либо очереди.

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