使用全局调度队列时,为什么不调用NSURLConnection委托方法?

时间:2011-03-29 15:16:53

标签: iphone ios multithreading nsurlconnection grand-central-dispatch

当我执行以下操作时:

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 个答案:

答案 0 :(得分:3)

在第一种情况下,该队列将被一些工作线程耗尽,该线程很可能不会运行runloop。

在第二种情况下,队列将由应用程序的主线程耗尽,该主线程将运行runloop。所以委托方法在runloop上安排。

希望Apple能尽快为此提供基于队列和块的API。同时,您可能会考虑ASIHTTPRequest,它允许您在连接完成时(或失败时)向NSOperationQueue提交块。

或者您可以显式配置NSURLConnection以使用主线程的runloop(或者您知道的其他一些特定的runloop足够长)。请参阅 - [NSURLConnection - scheduleInRunLoop:forMode:]

希望有帮助吗?