ждать, пока другой поток не закончится в цели c - PullRequest
0 голосов
/ 05 февраля 2011

Я использую MGTwitterEngine для получения твитов из твиттера.При этом используется асинхронная парадигма для извлечения этого твита в другом потоке.Он возвращает полученные результаты в основной поток.

Поскольку у меня есть некоторая обработка задач после получения твитов, я хотел бы представить другой поток, чтобы предотвратить блокировку потока пользовательского интерфейса.Я хотел бы сделать это следующим образом: поток пользовательского интерфейса запускает новый поток X. поток X запускает асинхронную выборку твитов с помощью MGTEngine, и ожидает , пока это не закончится.Когда MGTwitterEngine возвращается, поток X обрабатывает твиты и уведомляет поток пользовательского интерфейса о том, что мы готовы.

Мой вопрос таков: как настроить поток X для ожидания чтения MGTwitterEngine?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2011

Есть 2 способа сделать это.

  1. Использовать блокировку сетевых вызовов --- если возможно.

  2. Вызовите CFRunLoopRun () ---, чтобы дождаться другого события для продолжения операции в потоке. Когда асинхронная выборка данных завершена, вызовите CFRunLoopStop () для контекста X runloops в потоке x.

0 голосов
/ 05 февраля 2011

Сейчас очень мало оправданий, чтобы не использовать многопоточность с блоками. Они быстрее развиваются, чем 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);
...