我想知道为什么即使没有发生任何变化,也不会每次都收到信息NSURLResponse
。sendSynchronousRequest
看起来NSData
正在接收,但它没有被转换为字符串,然后没有NSArray
通过我的 json 调用转换为字符串。代码如下。下面的代码都在一个函数中,但不觉得名字是必要的。
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 次调用后,我发现来自转换为 an 的连接的字符串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 不允许字符串贪婪。