3

当我执行以下操作时:

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;在主线程上。

4

1 回答 1

3

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

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

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

或者您可以显式配置 NSURLConnection 以使用主线程的运行循环(或您知道的其他一些特定的运行循环将足够长)。见 -[NSURLConnection – scheduleInRunLoop:forMode:]

希望有帮助吗?

于 2011-03-29T15:35:12.797 回答