【问题标题】:NSURLConnection not return dataNSURLConnection 不返回数据
【发布时间】:2014-02-05 22:31:48
【问题描述】:

我有一个已经工作了一段时间的 NSURLConnection 突然不工作了。

由于某种原因,唯一被调用的委托方法是:

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

没有调用其他委托方法。我有其他类使用几乎相同的代码,只是不同的请求和 url,它们似乎都工作正常。我已经阅读了很多关于确保连接与委托等在同一个线程上的帖子,但似乎对我没有任何用处。我知道服务器正在返回响应,因为如果我通过一个简单的 html 表单传递相同的信息,我会在浏览器中得到响应,并且我可以看到服务器端脚本正在运行的证据,因为我可以看到它所做的更改SQL 数据。并且应用程序正在获得某种响应,它只是没有获取任何数据或调用 connectionDidFinishLoading 委托方法。

对可能出现的问题有什么想法吗?

这是我的代码的简化版本:

#import "RegistrationViewController.h"

@interface RegistrationViewController ()

@end

NSMutableData *responseData;
NSURLConnection *theconnection;

@implementation RegistrationViewController
/*
 *  Attempt to Register online. Returns False if valiation failed
 */
- (BOOL) registerOnline{

    // OTHER CODE HERE TO BUILD DATA FOR THE REQUEST

    // URL Request
    NSURL *requestUrl = [NSURL URLWithString:THEURL];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:requestUrl];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:[NSData dataWithBytes:[bodyData UTF8String] length:strlen([bodyData UTF8String])]];


    // Initialse Response Object
    responseData = [[NSMutableData alloc] init];

    // Conection
    theconnection = [NSURLConnection connectionWithRequest:request delegate:self];
    [theconnection start];

    return YES;
}

/*
 * Handle the event of registration failing
 */
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"didFailWithError");

    // OTHER CODE HERE TO HANDLE THE ERROR....

}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    NSLog(@"did receive response ");

}

/*
 * Handle the reciept of Data
 */
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSLog(@"didReceiveData");

    // Add data to the response
    [responseData appendData:data];\
}

/*
 * Data finnished loading
 */
-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"connectionDidFinishLoading");

    // OTHER CODE HERE TO HANDLE THE RESPONSE....
}

【问题讨论】:

  • 顺便说一句,您是否使用CFURLCreateStringByAddingPercentEscapesbodyData 中捕获的值进行了百分比转义?另外,如果bodyData 是一个字符串,[request setHTTPBody:[bodyData dataUsingEncoding:NSUTF8StringEncoding]]
  • 是的,我正在这样做,只是没有在上面显示它,因为我认为没有必要。我确信服务器正在成功接收我的请求数据。

标签: objective-c nsurlconnection


【解决方案1】:

您应该查看响应并诊断发生了什么。例如,如果 statusCode 不是 200,您可能会遇到问题。请参阅HTTP/1.1 Status Code Definitions

所以,您可以查看statusCode

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
        NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];

        if (statusCode == 200) {
            NSLog(@"received successful (200) response ");
        } else {
            NSLog(@"whoops, something wrong, received status code of %d", statusCode);
        }
    } else {
        NSLog(@"Not a HTTP response");
    }
}

你也在打电话:

theconnection = [NSURLConnection connectionWithRequest:request delegate:self];

这会自动启动连接。通过调用

[theconnection start];

您正在第二次启动它。删除 start 方法,或使用 initWithRequest:delegate:startImmediately:NO 作为最终参数。

【讨论】:

  • @user1775671 非常好。尝试删除多余的start 方法,看看是否可以解决问题。
  • 是的,我试过了。我无法想象这是一个很大的问题。那不是让它发送请求两次吗?
  • @user1775671 是的,您可能认为它只会发送两次,但根据我的经验,您实际上会遇到各种不可预知的行为。 (坦率地说,我不知道他们为什么不只是让start 只是报告一些有意义的错误/警告,如果您尝试将它与已经在进行中的连接一起使用,但他们没有。)我是删除多余的 start 调用时,您没有看到行为发生变化,这有点令人惊讶。无论如何,如果它仍然无法正常工作,那么您要么在请求的构建中遇到了其他问题,要么在服务器代码中存在其他问题。您问题中包含的有限代码看起来不错。
  • @user1775671 但我最惊讶的是你声称你既没有看到connectionDidFinishLoading 也没有看到didFailWithError 被调用,即使你看到didReceiveResponsestatusCode 调用,共200 个,即使在修复了多余的start 调用之后。你真的看到didReceiveResponse,但没有别的?
【解决方案2】:

如果它可以帮助任何人,对我来说问题是我在另一个线程中开始连接

所以一定要打电话

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

theconnection = [NSURLConnection connectionWithRequest:request delegate:self];
[theconnection start];

在主线程中。

【讨论】:

    猜你喜欢
    • 2014-03-29
    • 2012-01-31
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    相关资源
    最近更新 更多