Json NSURLResponse不总是接收数据

Json NSURLResponse不总是接收数据,json,nsurlconnection,nsdata,nsmutableurlrequest,no-response,Json,Nsurlconnection,Nsdata,Nsmutableurlrequest,No Response,我想知道为什么在sendSynchronousRequest中的nsurresponse即使没有发生更改,也不会每次都收到信息。看起来有NSData被接收,但它没有被转换成字符串,也没有通过我的json调用被转换成NSArray。代码如下。下面的代码都在一个函数中,但不需要名称 NSURL *searchURL = [NSURL URLWithString:@"website"]; NSString *searchedItem = searchFood.text; NSString *post

我想知道为什么在
sendSynchronousRequest
中的
nsurresponse
即使没有发生更改,也不会每次都收到信息。看起来有
NSData
被接收,但它没有被转换成字符串,也没有通过我的json调用被转换成
NSArray
。代码如下。下面的代码都在一个函数中,但不需要名称

NSURL *searchURL = [NSURL URLWithString:@"website"];
NSString *searchedItem = searchFood.text;
NSString *post = [NSString stringWithFormat:@"a=ajax_food_search3&u_id=*******&value=%@", searchedItem];
NSData *pData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSString *pLength = [NSString stringWithFormat:@"%d", [pData length]];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
[request setURL:searchURL];
[request setHTTPMethod:@"POST"];
[request setValue:pLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:pData];
//[request setTimeoutInterval:30];

NSURLResponse *response = nil;
NSError *err = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
NSString *sData = [NSString stringWithUTF8String:[data bytes]];

NSArray *jsonFoodArr = [sData objectFromJSONString];
if(jsonFoodArr != nil){
    NSDictionary *jsonDic = [jsonFoodArr objectAtIndex: 0];
    NSDictionary *jsonDat = [jsonDic objectForKey:@"dat"];
    NSArray *jsonFoodList = [jsonDat objectForKey:@"file"];

    for (int i = 0; i < [jsonFoodList count]; i++) {
        NSDictionary *fill = [jsonFoodList objectAtIndex:i];
        NSDictionary *foodDat = [fill objectForKey:@"fdat"];
        [foodResults addObject:[foodDat objectForKey:@"f_name"]];
    }

    NSLog(@"%@\n", foodResults);
}else {
    NSLog(@"Failed to read information");
}
失败和通过的
NSHTTPResponse
状态代码为200,因此页面仍在加载,但当我无法检索json时会发生此响应。我可以通过浏览器拨打多个电话,并且工作正常。在我用Android编写代码的整个过程中,Android都能获得json。所以两个系统没有给我这个反应

答复:

此问题的答案与用于转换
NSData
NSString
有关

NSString *sData = [[NSString alloc] initWithData: data encoding: NSUTF8String]
NSString *sData = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]
这是因为代码中的原始方式有可能使字符串尝试访问和存储内存地址中的信息,而这些地址的大小超出了仍然是
NSUTF8String
格式的数据的大小。分配字符串时,字符串仅为数据的大小,因此将仅将数据转换为该大小,并仅以该大小存储数据

这导致我的服务器响应始终具有正确的字符串,以便从中访问JSON对象。基本上,这是一个指针问题,因为缺少更好的单词,因为原始代码试图访问比它应该访问的更多的单词,因为它是一个开放式大小和副本,并且有点过于贪婪。alloc不允许字符串贪婪

回答:

此问题的答案与用于转换
NSData
NSString
有关

NSString *sData = [[NSString alloc] initWithData: data encoding: NSUTF8String]
NSString *sData = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]

这是因为代码中的原始方式有可能使字符串尝试访问和存储内存地址中的信息,而这些地址的大小超出了仍然是
NSUTF8String
格式的数据的大小。当您分配字符串时,字符串仅为数据的大小,因此将仅将数据转换为该大小,并仅以该大小存储数据。这导致我的服务器响应始终具有正确的字符串,以便从中访问JSON对象。基本上,这是一个指针问题,因为缺少更好的单词,因为原始代码试图访问比它应该访问的更多的单词,因为它是一个开放式大小和副本,并且有点过于贪婪。alloc将不允许字符串贪婪。

您通过引用传递err,但之后不检查它。在sendSynchronousRequest之后添加如下内容:
if(err)NSLog(@“Error:%@,[err localizedDescription])错误为零并且没有触发任何内容。所以当我把它写进代码时,它不会说什么。我只是试着再次检查,因为我之前得到的是零,但我想也许你的呼叫做了一些不同的事情。代码对我来说一目了然。我会通过编写一个能打上千次电话的小脚本并检查是否有故障来检查你的网站/服务器是否是魔鬼。我会试试看。我确实有在android上工作的问题,但在这里部分失败:-)发现这比没有更有趣。我希望服务器不是魔鬼,所以交叉手指,这样就不会出现故障。可能有人在同一时间登录时出现问题,因为当我继续通过internet登录时,它似乎失败得更多,因为浏览器处理等待,而这似乎没有进入队列,只是拒绝了它。