我想做的是获得对以下方法的响应
- (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
指的是 self
而 self
指的是后台线程而不是 UIViewController
类本身吗?
最佳答案
由于您要创建一个在循环中安排并稍后启动的连接,因此请确保使用 initWithRequest
的再现并将 startImmediately
参数设置为 否
。现在,您正在启动连接两次。而且,更重要的是,您在主运行循环中安排它之前启动它。
要解决此问题,请将 startImmediately
指定为 NO
:
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[conn scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[conn start];
话虽如此,我认为根本没有必要将此代码分派(dispatch)到后台队列(因为 initWithRequest
异步运行,不会对应用程序性能产生明显影响)。我唯一一次使用上述模式是在我将我的 NSURLConnection
请求包装在一些自定义 NSOperation
子类中时(在这种情况下,上述模式非常有用)。但在这种情况下,这是不必要的。
关于ios - iPhone开发在dispatch_async中调用NSURLConnection并在mainRunLoop中读取didReceiveResponse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23493479/