На мой взгляд, лучший способ - это libdispatch, также известный как Grand Central Dispatch (GCD). Он ограничивает вас iOS 4 и выше, но он так прост и удобен в использовании. Код, выполняющий некоторую обработку в фоновом потоке и затем выполняющий что-то с результатами в главном цикле выполнения, невероятно прост и компактен:
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Add code here to do background processing
//
//
dispatch_async( dispatch_get_main_queue(), ^{
// Add code here to update the UI/send notifications based on the
// results of the background processing
});
});
Если вы еще этого не сделали, посмотрите видео с WWDC 2010 на libdispatch / GCD / blocks.