我正在使用此调用在 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 示例.