SetNeedsDisplay, по сути, устанавливает флаг, который будет вызывать повторную визуализацию элемента управления в следующий раз вокруг цикла пользовательского интерфейса.Это не вступит в силу немедленно, так как обычно оно немного задерживается, так что различные обновления пользовательского интерфейса могут быть объединены.
Выполнение вызова sleep () в потоке пользовательского интерфейса действительно вызывает недовольство ... если выжелая выполнить какое-то действие через несколько секунд после сокрытия вашей кнопки, я бы порекомендовал вызвать performSelector:withObject:afterDelay:
в соответствии с этим потоком:
Как использовать executeSelector: withObject: afterDelay: с примитивамиКакао?
В общем, вы хотите, чтобы блок потока пользовательского интерфейса был как можно меньше, так как любой код блокировки (например, спящий режим) приведет к задержке пользовательского интерфейса, как правило, не отвечает илипляжный мяч (SPoD).