Ios 在dispatch_async内调用NSURLConnection并在iPhone开发的mainRunLoop中读取didReceiveResponse

Ios 在dispatch_async内调用NSURLConnection并在iPhone开发的mainRunLoop中读取didReceiveResponse,ios,objective-c,nsurlconnection,nsrunloop,dispatch-async,Ios,Objective C,Nsurlconnection,Nsrunloop,Dispatch Async,我试图做的是得到以下方法的响应 - (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { } 打了这个电话之后 NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; [conn scheduleInRunLoop:[NSRunLoop

我试图做的是得到以下方法的响应

 - (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { }
打了这个电话之后

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[conn scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[conn start];

dispatch_async();
但是
连接
方法没有调用。但是当我在
dispatch\u async
之外运行
NSURLConnection
代码时,它会调用该方法

原因是什么?我如何纠正?
这是因为
delegate
指的是
self
self
指的是后台线程,而不是
UIViewController
类本身吗?

因为您正在创建一个要在循环中调度并稍后启动的连接,确保使用
initWithRequest
的格式副本,并立即将
开始
参数设置为
。现在,您要启动两次连接。而且,更重要的是,您在主运行循环中计划它之前就启动了它

要解决此问题,请将
立即开始
指定为

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[conn scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[conn start];


话虽如此,我认为根本没有必要将此代码分派到后台队列(因为
initWithRequest
异步运行,对应用程序性能没有明显影响)。我唯一一次使用上述模式是在一些自定义的
NSOperation
子类中包装我的
NSURLConnection
请求时(在这种情况下,上述模式非常有用)。但是在这种情况下,它是不必要的。

调用
dispatch\u async
时,您在哪个线程上运行?在
dispatch\u async()
中使用哪个调度队列?在调用
NSURLConnection
时,我在
dispatch\u async()
中。通过调用
[self-performSelectorOnMainThread:@selector(myBgWork)with-object:Nil waitUntilDone:NO]这并将我的
NSURLConnection
代码放入
myBgWork
中,它为我提供了
didReceiveResponse
的响应。但现在我感到困惑,因为我觉得我的后台工作再次调用主线程,这将减慢我的应用程序。是吗?谢谢你的回复。我使用了
dispatch\u async()
,因为我也有一个文件压缩过程,这将花费相当长的时间。@AnujAroshA然后您可以将该压缩过程调度到后台队列。但是,将连接的开始调度到后台队列没有意义,特别是如果您要在主运行循环中调转并调度它(这意味着在主线程上调用所有委托方法,即使您从后台队列实例化连接)。即使它没有在主线程上运行,也没有理由不运行。只需将缓慢压缩的代码发送到后台队列。