Ответ NSURLConnection не завершен

Я звоню серверу, запрашивая данные JSON, используя NSURLConnection.

По какой-то причине я получаю часть ответа. Если я нажму URL-адрес через браузер, ответ будет правильным. Странно то, что это происходит только иногда. Поэтому мне трудно отлаживать проблему.

Затем, когда ответ не завершен, я получаю следующую ошибку: Error Domain=NSCocoaErrorDomain Code=3840 «Операция не может быть завершена. (Ошибка Cocoa 3840.)» (Недопустимое значение вокруг символа 0.) UserInfo= 0xa4634a0 {NSDebugDescription=Недопустимое значение около символа 0.} { NSDebugDescription = "Недопустимое значение около символа 0.";

Я предполагаю, что это также может быть проблема с самим сервером. Вот мой код:

-(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];
    }
}

Заранее спасибо.


person Rico    schedule 13.04.2013    source источник


Ответы (1)


То, что вы видите, является нормальным поведением. didReceiveData можно вызывать любое количество раз. Вам решать продолжать накапливать данные, пока не получите connectionDidFinishLoading.

Стандартная структура делегата выглядит следующим образом:

- (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
}

Всегда реализуйте все четыре метода делегата.

person matt    schedule 13.04.2013
comment
А для получения дополнительной информации см. соответствующий раздел моей книги: http://www.apeth.com/iOSBook/ch37.html#_http_requests - person matt; 13.04.2013
comment
Это была именно проблема. еще раз спасибо. Вместо этого я бы добавил инициализацию объекта в ваш ответ в didReceiveResponse self.receivedData = [[NSMutableData alloc] initWithCapacity:0]. - person Rico; 13.04.2013
comment
Неплохая идея, спасибо. Кстати, если вы собираетесь это сделать, можете просто сказать [NSMutableData new]. - person matt; 13.04.2013
comment
Я некоторое время отлаживал то же самое и собирался реализовать сложный хак, чтобы попытаться заставить это работать. Я бы хотел, чтобы это было задокументировано немного лучше. Но большое спасибо, Мэтт! Это была именно моя проблема. - person Dave; 02.11.2013