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

标签 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 方法没有调用。但是当我在 dispatch_async 之外运行 NSURLConnection 代码时,它会调用该方法。

这是什么原因,我该如何纠正? 这是因为 delegate 指的是 selfself 指的是后台线程而不是 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/

相关文章:

ios - 如何从 UIactionsheet 中的 UISwitch 获取答案

ios - 通过 Cocoapods 添加到 Objective-C 应用程序中的 Swift 框架 - "Module not found"

ios - 如何在Swift中为遵循BezierPath的imageView的点1到2和点2到3设置不同的animation.duration时间?

从 XIB 加载的 iOS UITableView header

ios - 更改 Firebase 的包 ID

ios - 查找 NSURLSession/NSURLConnection 的 URL HTTP 加载失败(kCFStreamErrorDomainSSL,-9802)错误

ios - 如何为 HTTP 请求指定服务器 IP 而不是 DNS

objective-c - sendSynchronousRequest 使用安装在 Mac OS X keychain for Mac 上的自签名证书

ios - 在 VS for Mac 中无法查看个人团队配置文件

objective-c - Swift 找不到类(typedef struct objc_class *Class)?