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然后您可以将该压缩过程调度到后台队列。但是,将连接的开始调度到后台队列没有意义,特别是如果您要在主运行循环中调转并调度它(这意味着在主线程上调用所有委托方法,即使您从后台队列实例化连接)。即使它没有在主线程上运行,也没有理由不运行。只需将缓慢压缩的代码发送到后台队列。