Почему методы делегата NSURLConnection не вызываются при использовании глобальной очереди отправки? - PullRequest
3 голосов
/ 29 марта 2011

Когда я делаю следующее:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, NULL), ^{
  create NSURLRequest;
  create NSURLConnectionDelegate;
  create NSURLConnection;
  start NSURLConnection;
});

Методы делегата никогда не вызываются.Но когда я делаю

dispatch_async(dispatch_get_main_queue(), ^{
  create NSURLRequest;
  create NSURLConnectionDelegate;
  create NSURLConnection;
  start NSURLConnection;
});

, им звонят.Почему?

UPD

http://developer.apple.com/library/ios/#qa/qa1712/_index.html

Теперь я создаю NSURLConnection;запустить NSURLConnection;в основной теме.

1 Ответ

3 голосов
/ 29 марта 2011

В первом случае эта очередь будет очищена некоторым рабочим потоком, который, скорее всего, не будет иметь запущенного цикла выполнения.

Во втором случае очередь очищается основным потоком вашего приложения, в котором будет запущен цикл запуска. Таким образом, методы делегата планируются в этом цикле выполнения.

Надеюсь, Apple скоро предложит API на основе очередей и блоков. Между тем вы можете подумать о ASIHTTPRequest , который позволяет отправлять блоки в NSOperationQueue, когда соединение установлено (или когда оно не удается).

Или вы можете явно настроить NSURLConnection для использования цикла выполнения основного потока (или какого-либо другого определенного цикла запуска, который, как вы знаете, будет достаточно долго). Смотрите - [NSURLConnection - scheduleInRunLoop: forMode:]

Надеюсь, это поможет?

...