Сейчас очень мало оправданий, чтобы не использовать многопоточность с блоками. Они быстрее развиваются, чем NSOperations, синхронизация проще, прыжковые потоки (например, захват потока пользовательского интерфейса) проще, и, по моему личному опыту, производительность выше.
В этом случае я бы создал блок, породил новый поток, чтобы запустить асинхронную выборку (возможно, порождая асинхронную выборку для каждой - облегчает отмены), поместив 2 блока синхронизации в очередь, которые будут срабатывать после выборок сделано для обработки и обновления пользовательского интерфейса.
Вот хорошая пачка: http://www.fieryrobot.com/blog/2010/06/27/a-simple-job-queue-with-grand-central-dispatch/
//GOES IN Tweet delegate
myQueue = dispatch_queue_create("myQueue", 0);//local instance var dispatch_queue_t
dispatch_async(myQueue, ^{
[self processTweets];//executed after fetch is done.
dispatch_sync(dispatch_get_main_queue(), ^{
[self uiBasedFunction];//executed on main thread
});
});
dispatch_release(myQueue);