Ваш метод меняет цвет синхронно дважды.Весь этот код выполняется в главном потоке.
// run on main thread
[letterlabel performSelectorOnMainThread:@selector(setTextColor:) withObject:[UIColor blackColor] waitUntilDone:YES];
// buttonClicked: called on mainThread so this is on main thread
[NSThread sleepForTimeInterval:3];
// also on main thread ...
[letterLabel performSelectorOnMainThread:@selector(setTextColor:) withObject: [UIColor greenColor] waitUntilDone:YES];
Основной поток пользовательского интерфейса зацикливается и ищет код для запуска на основе таких вещей, как нажатия кнопок.Как только щелчок обнаружен, ваш метод выполняется, устанавливает цвет, ждет три секунды, а затем снова устанавливает цвет, прежде чем основной цикл пользовательского интерфейса сможет перерисовать.Поскольку пользовательский интерфейс не перерисовывается между ними, вы никогда не увидите первый.
Если вы хотите сделать это, вам нужно будет установить цвет, затем в фоновом потоке, подождать три секунды и затем вызватьвернуться к основному потоку для обновления пользовательского интерфейса.
Это сообщение по теме:
GCD, Потоки, поток программ и обновление пользовательского интерфейса