【问题标题】:NSURLConnection delegate methods are not called不调用 NSURLConnection 委托方法
【发布时间】:2011-08-12 19:56:15
【问题描述】:

我正在尝试创建一个简单的 NSURLConnection 以使用 GET 请求与服务器进行通信。 Connection 运行良好,但从未调用 NSURLConnection 的委托方法..

这是在做什么:

NSString *post = [NSString stringWithFormat:@"key1=%@&key2=%@&key3=%f&key4=%@", val1, val4, val3, val4];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease] ;

[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.domain.com/demo/name/file.php?%@", post]]];

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];

已经实现了以下委托方法,但是没有一个被调用..

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"did fail");
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSLog(@"did receive data");
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    NSLog(@"did receive response ");
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"did finish loading");
    [connection release];
}

我错过了什么吗?

【问题讨论】:

  • 你连接到互联网了吗??
  • 您能否验证此时您的所有变量都不是 nil (无论出于何种原因)?
  • 检查变量 connection 的值,因为它可能由于某种原因具有 nil 值。

标签: iphone nsurlconnection nsurlprotocol


【解决方案1】:

你是在后台线程上调用它吗?如果您在后台线程上执行此操作,则该线程可能在调用委托之前就退出了。

【讨论】:

  • 我在创建连接之前尝试了 NSLog(@"Is%@ main thread", ([NSThread isMainThread] ?@"" : @" NOT"),它返回 "is Main线程”
  • 为了连接正常工作,调用线程的运行循环必须在默认运行循环模式下运行。你也可以检查一下吗
  • 我发现了问题所在......而且我也让它工作了。但是我仍然想对此进行一些澄清。实际上我在类的静态方法中创建了连接,并且从未调用过委托函数。当我在实例方法中创建连接时,一切正常... delgate现在正在调用函数... 那么,现在的问题是,在静态方法中创建连接还是在实例方法中创建连接时有什么区别?
【解决方案2】:

尝试在主线程上运行操作:

NSURLConnection * connection = [[NSURLConnection alloc] 
                                initWithRequest:request
                                       delegate:self startImmediately:NO];

[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] 
                      forMode:NSDefaultRunLoopMode];
[connection start];

【讨论】:

【解决方案3】:

尝试检查接收到的响应的长度,它不应该得到 0 字节的数据。

【讨论】:

    【解决方案4】:

    除了检查是否从主线程调用请求之外,您还可以检查是否将执行时间还给系统(如果您退出“main”)。 我有一些测试代码会一直循环,直到调用委托:它永远不会被调用,因为系统需要做一些事情才能在主线程中调用委托。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      相关资源
      最近更新 更多