NSURLResponse并不总是接收数据

时间:2012-02-20 17:18:39

标签: json nsurlconnection nsdata nsmutableurlrequest no-response

我想知道为什么NSURLResponse中的sendSynchronousRequest每次都不会收到信息,即使没有发生任何变化。看起来收到了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");
}

我想补充一点,我的NSData对象在连接失败以及工作时给出了相同的字节。我不确定是不是因为他们使用相同的内存地址,我觉得完全不可能因为当我重新启动应用程序时计算机无法幸运。无论哪种方式,我都没有收到任何错误,我确实收到了回复,但我确实收到了某种数据,但NSString并没有每次都转换它给我一个不是零的json。

我在对服务器进行1000次调用后发现,来自转换为NSString的连接的字符串在失败时给我这个。

    [
          {
            "cmd": null,
            "dat": {
              "file": [
                {
                  "name": "Rob's Doc",
                  "f_id": "6",
                  "user_id": "******",
                  "ts": "1329488441"
                },
                {
                  "name": "Objective C",
                  "f_id": "566",
                  "user_id": "******",
                  "ts": "1328116043"
                },
                {
                  "name": "Football Challenge",
                  "f_id": "314",
                  "user_id": "******",
                  "ts": "1326396493"
                }
              ],
              "view_id": null
            }
          }
        ]
    ll}}]
0=0 Pragma: no-cache Connection: close Transfer-Encoding: chunked Content-Type: text/html
     10c [
      {
        "cmd": null,
        "dat": {
          "file": [
            {
              "name": "**** Doc",
              "f_id": "6",
              "user_id": "******",
              "ts": "1329488441"
            },
            {
              "name": "Objective C",
              "f_id": "566",
              "user_id": "******",
              "ts": "1328116043"
            },
            {
              "name": "Football Challenge",
              "f_id": "314",
              "user_id": "******",
              "ts": "1326396493"
            }
          ],
          "view_id": null
        }
      }
    ] 0

失败和传递的NSHTTPResponse状态代码是200,因此页面仍然加载,但是当我无法检索json时会发生此响应。我可以通过浏览器进行多次调用,并且可以正常工作。 Android在我用它们编码的整个过程中获得json并没有失败。所以两个系统都没有给我这个回应。

解答:

此问题的答案与NSString用于转换NSData应该存在的内容有关

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

这是因为代码中的原始方式有可能字符串将尝试访问并存储来自仍然是NSUTF8String格式的数据大小之外的内存地址的信息。分配字符串时,字符串只是数据的大小,因此只会将数据转换为该大小,并且只存储该大小的数据。

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

1 个答案:

答案 0 :(得分:1)

解答:

此问题的答案与NSString用于转换NSData应该存在的内容有关

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

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