Я сам много раз использовал эту технику, и я не думаю, что это не слишком элегантно ... однако, альтернатива, которую вы могли бы попробовать, это:
performSelectorOnMainThread:withObject:waitUntilDone:NO
.
Тот факт, что вы уже находитесь в главном потоке, не означает, что он не будет работать (на самом деле документы ссылаются на поведение, которое будет происходить при вызове из основного потока) ... и я думаю, что оно будет иметь такое же поведение, когда Параметр waitUntilDone имеет значение NO, где он ставит в очередь запрос на выполнение селектора и запускает его по окончании текущего цикла выполнения.