NSURLConnection 委托方法未执行 [关闭]

Posted

技术标签:

【中文标题】NSURLConnection 委托方法未执行 [关闭]【英文标题】:NSURLConnection delegate methods are not executing [closed] 【发布时间】:2016-08-04 19:24:22 【问题描述】:
NSURL *httpsURL = [NSURL URLWithString:@"https://example.com"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:httpsURL cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:5.0f];
self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
[self.connection start];

while(something) 
    // some code

在上面的代码中,代理(例如:willSendRequestForAuthenticationChallenge)在while 循环完成之前不会执行。这种行为的原因是什么以及如何克服这个问题?我希望代表在后台执行。我怎样才能实现它?

提前致谢。

【问题讨论】:

不要使用 NSURLConnection。它已被弃用。 无关,但不要调用start,因为connectionWithRequest:delegate:会自动启动连接。唯一一次调用start 是在您启动连接时将startImmediately 设置为false。但这没有实际意义,因为您应该使用 NSURLSession 【参考方案1】:

NSURLConnection 已弃用。使用 NSURLSession。当你这样做时,将会话的delegateQueue 设置为后台队列。这样,您的委托消息就可以到达。现在,您正在阻止它们到达,因为它们想要到达主线程而他们不能。

但是,正如 dgatwood 所说,如果您正在做一些可能会阻塞主线程的耗时的事情,那也是错误的。如果您尝试此类操作,您的应用将被 WatchDog 进程杀死。

【讨论】:

让运行循环只运行一次是不够的。 NSURLConnection 的所有回调都发生在连接开始的同一个线程上,所以如果你在同一个线程中做很多工作,你将延迟连接的各个方面——不仅仅是建立连接,还发送标头,处理初始响应(状态代码和标头),读取/累积响应数据,并告诉您的应用程序请求已完成。将您正在执行的任何处理移动到一个单独的线程中,这样您就不会阻塞主线程。 @dgatwood 好点,完全修改了我的答案。 我可以使用 nsurlconnection,尽管它已被弃用,因为它用于企业分发。主要问题是,一旦我得到响应,我应该返回调用函数(简单地说,我想在处理认证时做一个同步请求),因为这个函数是由 javascript 代码调用的,本机函数应该返回响应背部。如果这不能通过 nsurlconnection 实现,那么我想使用 NSUrlSession。请建议我执行此任务的方法 我不会做这种事。我回答了你问的问题。如果您问错了问题,请提出一个新问题,并尝试这次做得更好。

以上是关于NSURLConnection 委托方法未执行 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

与 NSURLConnection 委托方法相关的查询

在 Apple 的开发人员文档中找不到所需的 NSURLConnection 委托方法。为啥?

如何从 NSURLConnection 委托发送多个 url 请求?

https 上的 NSURLConnection 同步请求

NSURLConnection 是不是保留其委托?

NSURLConnection(作为 AFNetworking 的一部分)不调用 NSURLConnectionDataDelegate 委托