1
votes

I am making call to a server requesting JSON data using NSURLConnection.

For some reason I get part of the response. If I hit the url through the browser the response its correct. The weird thing is that it happens only sometime. So I'm having a hard time debugging the issue.

Then when because the response is not complete I get the following error: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid value around character 0.) UserInfo=0xa4634a0 {NSDebugDescription=Invalid value around character 0.} { NSDebugDescription = "Invalid value around character 0."; }

I guess it could also be an issue with the server it self. Here's my code:

-(void) getShareHistory:(NSString *)range paging:(NSInteger *)page{
     NSString *post = [NSString stringWithFormat:@"range=%@&paging=%@",
                      range,
                      [NSString stringWithFormat:@"%ld",(long)page]];
     NSString *url = [NSString stringWithFormat:@"http://www/domai.com/handle_share_links.php?action=history"];
     NSData *post_data = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
     NSString *postLength = [NSString stringWithFormat:@"%d", [post_data length]];
     NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
     [request setCachePolicy:NSURLRequestUseProtocolCachePolicy];
     [request setURL:[NSURL URLWithString:url]];
     [request setHTTPMethod:@"POST"];
     [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
     [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
     [request setHTTPBody:post_data];

     self.shareHistoryConn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)response{
     NSString *strData = [[NSString alloc]initWithData:response encoding:NSASCIIStringEncoding];
     NSLog(@"response %@",strData);
     NSError *jsonParsingError = nil;
     if(connection == self.shareHistoryConn)
     {
        NSArray *data = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingAllowFragments error:&jsonParsingError];
    if(!jsonParsingError)
    {
        [[self delegate] onGetShareHistorySuccess:data];
    }else{
        [[self delegate] onGetShareHistoryFailed:jsonParsingError];
    }
}

Thanks in advance.

1

1 Answers

3
votes

What you're seeing is normal behavior. didReceiveData can be called any number of times. It is up to you to keep accumulating the data until you get connectionDidFinishLoading.

The standard delegate structure is like this:

- (void) connection:(NSURLConnection *)connection
        didReceiveResponse:(NSURLResponse *)response {
    // connection is starting, clear buffer
    [self.receivedData setLength:0];
}

- (void) connection:(NSURLConnection *)connection
        didReceiveData:(NSData *)data {
    // data is arriving, add it to the buffer
    [self.receivedData appendData:data];
}

- (void)connection:(NSURLConnection*)connection
        didFailWithError:(NSError *)error {
    // something went wrong, clean up interface as needed
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    // all done, we are ready to rock and roll
    // do something with self.receivedData
}

Always implement all four delegate methods.