当我使用connectionWithRequest:delegate时,我的委托方法永远不会被调用

时间:2009-09-13 17:50:07

标签: iphone objective-c asynchronous httprequest

我正在使用此调用在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:说:

  

委托

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

我认为调用是从主线程开始的(假设,如果我没有显式启动新线程,一切都在一个线程中运行正确吗?),我用这个检查线程:< / p>

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的例子:实际命中的委托代表了。

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

有两件事突然袭来我:

  • 你的错误方法有一个错误的原型(但仍应该被调用):

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

  • 您应该检查以确保从+ connectionWithRequest:delegate:获得有效的连接。它可能甚至没有启动请求。