Это ужасно:
[NSThread detachNewThreadSelector:@selector(updateProgressBar)toTarget:self withObject:nil];
Потому что это:
- создает много тем.
- , поскольку я ожидаю, что он обновляет пользовательский интерфейс, в то время как он должен обновляться только из основного потока.
Думаю, гораздо лучше будет сделать что-то подобное:
[self performSelectorOnMainThread:@selector(updateProgressBar)
withObject:nil // or any object you need to pass
waitUntilDone:NO] //
И метод, который вы привели в качестве примера - вместо этого его следует запускать в отдельном потоке.
В этом случае у вас будет один фоновый поток, выполняющий всю тяжелую работу, и он будет уведомлять основной поток об обновлениях пользовательского интерфейса.