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

我想要做的是获得以下方法的响应

- (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(); 

connection方法不是调用。 但是当我在dispatch_async之外运行NSURLConnection代码时,它会调用该方法。

这是什么原因,我该如何纠正? 是因为delegate引用selfself引用后台线程而不是UIViewController类本身?

由于您要创建一个在循环中调度并稍后启动的连接,因此请确保使用initWithRequest的再现,并将startImmediately参数设置为NO 。 现在,你开始连接两次。 而且,更重要的是,您在主运行循环中安排它之前启动它。

要解决此问题,请将startImmediately指定为NO

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

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