У меня была такая же проблема. Кажется, что setText автоматически не вызывает перерисовку, когда изменение происходит в неосновном потоке. Обновления пользовательского интерфейса всегда должны выполняться в главном потоке, чтобы обеспечить оперативность. Есть другой способ заставить его использовать селектор:
label = [[UILabel alloc] init]; //assumes label is a data member of some class
...
(some later method where you want to update the label)
...
[label performSelectorOnMainThread:@selector(setText) withObject:@"New label value" waitUntilDone:false];
Вы также можете получить результаты, просто сказав:
[label setNeedsDisplay];
, что приведет к внутреннему обновлению, но по усмотрению SDK. Я обнаружил, что это не работает для меня, поэтому я рекомендую селектор в главном потоке.