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

时间:2014-05-06 11:29:22

标签: 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 mainRunLoop] forMode:NSDefaultRunLoopMode];
[conn start];

里面的

dispatch_async();

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

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

1 个答案:

答案 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个请求时(在这种情况下,上述模式非常有用)。但在这种情况下,没有必要。