Можно ли выполнить блок завершения из ASIHTTPRequest / AFNetworking в фоновом потоке? - PullRequest
4 голосов
/ 27 февраля 2012

Я запускаю свой ASIHTTPrequest синхронно в отдельном потоке, например:

//inside this start method I create my ASIHTTPRequest and start it
dispatch_async(dispatch_get_global_queue(0, 0), ^{
    [process start];
});

Но блок завершения все еще запускается в основном потоке. Можно ли сохранить выполнение блока завершения в том же потоке, где был запущен запрос?

Единственное, что я могу придумать, чтобы решить эту проблему, - это определить очередь отправки и вручную выполнить завершение блока в том же потоке, удерживая, таким образом, ссылку на созданную очередь. Но это не решает проблему напрямую, потому что вы пропустите небольшой момент в основном потоке, прежде чем перенаправить остальную часть кода в созданную очередь отправки.

У кого-нибудь есть лучшее решение?

РЕДАКТИРОВАТЬ: То же самое относится и к блокам завершения AFNetworking ...

Ответы [ 2 ]

4 голосов
/ 28 февраля 2012

Хорошо, чтобы ответить на мой собственный вопрос: фреймворк ASIHTTPRequest не имеет возможности запускать блоки завершения в другом потоке.

Вместо этого можно использовать инфраструктуру AFNetwork.Здесь у вас есть два свойства для любого типа AFOperation, называемые « successCallbackQueue » и « faultCallbackQueue ».Где вы можете добавить предопределенный ' dispatch_queue_t ' для обработки выполнения блоков успеха и неудач.

Надеюсь, что это поможет другим с такой же проблемой!

ОБНОВЛЕНИЕ: Пример

 dispatch_queue_t requestQueue = dispatch_queue_create("requestQueue", NULL);
 AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:yourRequest];
 operation.successCallbackQueue = requestQueue;
 operation.failureCallbackQueue = requestQueue;
 [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    // add code for completion
 } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // add code for failure
 }];
 [operation start];
0 голосов
/ 27 февраля 2012

Попробуйте использовать определенную очередь вашего собственного создания. Затем вы можете (как только он окончательно завершится в своем блоке завершения) отправить сигнал в глобальную очередь, чтобы обновить любое необходимое отображение.

...