我要做的是获得以下方法的响应
- (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
方法没有调用。但是当我在NSURLConnection
之外运行dispatch_async
代码时,它会调用该方法。
这是什么原因,我该如何纠正?
这是因为delegate
是指self
而self
是指后台线程而不是UIViewController
类本身?
答案 0 :(得分:0)
由于您创建了一个要在循环中安排并稍后启动的连接,因此请务必使用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
个请求时(在这种情况下,上述模式非常有用)。但在这种情况下,没有必要。