Iphone 为什么NSURLConnection委托方法不';使用全局调度队列时,是否无法调用?

Iphone 为什么NSURLConnection委托方法不';使用全局调度队列时,是否无法调用?,iphone,ios,multithreading,nsurlconnection,grand-central-dispatch,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(dispat

当我执行以下操作时:

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

现在我知道了 创建连接; 启动NSURL连接;
在主线程上。

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

在第二种情况下,队列由应用程序的主线程排出,主线程将运行runloop。因此,委托方法在该运行循环上得到调度

希望苹果不久将为此提供一个基于队列和块的API。同时,您可能会考虑,它允许您在连接完成时(或连接失败时)向NSOperationQueue提交块

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

希望有帮助