1

我正在使用此调用在 iPhone 应用程序中发出异步 POST 请求:

    [NSURLConnection connectionWithRequest:req delegate:self];

该请求似乎可以很好地到达服务器,但没有一个委托方法被命中。我已经实现:

- (void)connection:(NSURLConnection *)connection didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

- (void) connectionDidFinishLoading:(NSURLConnection *)connection

- (void) connection:didFailWithError:(NSURLConnection *)connection 

这些方法的任何日志消息都不会出现。connectionWithRequest:delegate: 的文档说:

delegate

连接的委托对象。随着加载的进行,委托将接收委托消息。发送给委托的消息将在调用此方法的线程上发送。为了使连接正常工作,调用线程的运行循环必须在默认运行循环模式下运行。

我认为调用是从主线程进行的(假设如果我没有明确地启动一个新线程,那么一切都在一个线程中运行正确吗?),我用这个检查了线程:

CFRunLoopRef loop = CFRunLoopGetMain();
CFStringRef modeString = CFRunLoopCopyCurrentMode(loop);
NSLog(@"The main loop is running in mode: %@", modeString);

这会创建此控制台输出:

2009-09-13 13:32:05.611 影视素材[686:20b] 主循环在模式下运行:kCFRunLoopDefaultMode

所以,这听起来像是在默认的运行循环模式下。还有什么我应该看的可以告诉我为什么我的委托方法没有被命中吗?在请求完成之前,代表绝对不会死。

更新:CFRunLoopGetCurrent 的模式为 kCFRunLoopDefaultMode。

更新(东部时间下午 5:40):嗯,我已经切换到使用 initWithRequest:delegate: startImmediately 以使回调继续进行,但我仍然希望看到一个实际击中委托的 connectionWithRequest:delegate 示例.

4

2 回答 2

3

我有一个类似的问题。没有调用我的代表的原因是,在我调用 connectionWithRequest 之后,我启动了一个循环来检查来自连接的数据是否已发送。由于我从未将控制权返回给 RunLoop 代码,因此队列中的消息从未得到处理,因此也没有调用委托的方法......只要确保在调用 connectionWithRequest 后你没有做任何繁重的事情,一切都应该工作很好。

于 2010-07-25T20:34:31.973 回答
1

我突然想到两件事:

  • 您的错误方法的原型错误(但仍应调用):

connection: (NSURLConnection *) connection didFailWithError: (NSError *) error

  • 您应该检查以确保您从+ connectionWithRequest:delegate:. 它甚至可能没有开始请求。
于 2009-09-13T18:36:39.153 回答