NSURLResponse не всегда получает данные
Мне было интересно, почему в 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 обращений к серверу я обнаружил, что строка, исходящая из соединения, преобразуется в 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. По сути, это была проблема с указателем из-за нехватки лучших слов в том смысле, что исходный код пытался получить доступ больше, чем предполагалось, потому что это был открытый размер и копия, и он был слишком жадным. быть жадным
1 ответ
ОТВЕТ:
Ответ на эту проблему относится к NSString
что используется для конвертации NSData
что там должно быть
NSString *sData = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]
Это связано с тем, что оригинальный способ в коде имеет шанс, что строка попытается получить доступ и сохранить информацию с адресов памяти, выходящих за пределы размера данных, которые все еще будут в NSUTF8String
формат. Когда вы выделяете строку, строка представляет собой только размер данных и, следовательно, будет преобразовывать только данные в этот размер и сохранять данные только в этом размере. Это заставило мой ответ сервера всегда иметь правильную строку для последующего доступа к объектам JSON. По сути, это была проблема с указателем из-за нехватки лучших слов в том смысле, что исходный код пытался получить доступ больше, чем предполагалось, потому что это был открытый размер и копия, и он был слишком жадным. быть жадным