2013-04-13 86 views
1

我正在使用NSURLConnection調用請求JSON數據的服務器。NSURLConnection響應不完整

出於某種原因,我收到了部分回覆。如果我通過瀏覽器訪問網址,則回覆是正確的。奇怪的是,它只發生在某個時間。所以我很難調試這個問題。

然後,當因爲響應是不完整的,我得到以下錯誤: 錯誤域= NSCocoaErrorDomain代碼= 3840「的操作無法完成(可可錯誤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]; 
    } 
} 

在此先感謝。

回答

3

你看到的是正常的行爲。 didReceiveData可以被調用任意次數。直到您獲得connectionDidFinishLoading,您才能繼續累積數據。

標準的代表結構是這樣的:

始終貫徹四個委託方法。

+0

欲瞭解更多信息,請參閱我的書的相關部分:http://www.apeth.com/iOSBook/ch37.html#_http_requests – matt

+0

這正是問題所在。再次感謝。 相反,我會在didReceiveResponse self.receivedData = [[[NSMutableData alloc] initWithCapacity:0]中將對象的初始化添加到您的答案中。 – Rico

+0

不是一個壞主意,謝謝。如果你打算這麼做,順便說一下,你可以直接說'[NSMutableData new]'。 – matt