2016-08-04 100 views
-3
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的委托方法不执行

在此先感谢。

+0

请勿使用NSURLConnection。它已被弃用。 – matt

+0

不相关,但不要调用'start',因为'connectionWithRequest:delegate:'自动启动连接。你唯一一次调用'start'就是当你用'startImmediately'设置为'false'来启动连接的时候。但它没有实际意义,因为你应该使用'NSURLSession'。 – Rob

回答

1

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

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

+0

让运行循环只运行一次是不够的。 NSURLConnection的所有回调都发生在连接开始的同一个线程上,所以如果你在同一个线程中做了很多工作,你会延迟连接的每个方面 - 不仅仅是建立连接,还要发送头文件,处理初始响应(状态码和头文件),读取/累积响应数据,并告诉应用程序请求已完成。将所做的任何处理移动到单独的线程中,以便根本不会阻塞主线程。 – dgatwood

+0

@dgatwood好点,完全修改了我的答案。 – matt

+0

我可以使用nsurlconnection,虽然它已被弃用,因为这是针对企业分布的。主要的问题是,一旦我得到响应,我应该返回调用函数(简单地说,我想在处理aurhentication时执行同步请求),因为此函数由javascript代码调用,并且本地函数应返回响应背部。如果nsurlconnection无法实现,那么我想用NSUrlSession。请给我一个方法来执行这个任务 –

相关问题