2

Мне было интересно, почему в NSURLResponse в sendSynchronousRequest не будет получать информацию каждый раз, даже если никаких изменений не произошло. Похоже, что получено NSData, но оно не преобразуется в строку, а затем не преобразуется в NSArray через мой json-вызов. Код ниже. Код ниже - все в одной функции, но не чувствую, что это имя необходимо.NSURLResponse не всегда принимает данные

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. В основном, это была проблема указателя из-за отсутствия лучших слов в том смысле, что исходный код пытался получить доступ к большему, чем предполагалось, потому что он был открытым размером и копией и был слишком жадным значением, чтобы не допускать строку быть жадным.

+0

Вы передаете ошибку по ссылке, но не проверяете ее позже. Добавьте что-то подобное после вашего sendSynchronousRequest: 'if (err) NSLog (@" Error:% @ ", [err localizedDescription]);' – bneely

+1

err is no и ничего не стреляет. Поэтому, когда я помещаю это в код, он ничего не скажет. Я просто попробовал удвоить проверку, потому что раньше у меня было ноль, но, может быть, ваш звонок сделал что-то другое. – Rob

+0

Невозможно распечатать описание объекта NIL. это то, что я получаю и в отладчике gdb. – Rob

ответ

1

ОТВЕТ:

Ответ на этот вопрос относится к NSString, который используется для преобразования NSData, что должно быть там

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

Это потому, что оригинальный способ в коде есть шанс что строка попытается получить доступ и сохранить информацию из адресов памяти за пределами размера данных, которые все еще будут в формате NSUTF8String. Когда вы выделяете строку, строка представляет собой только размер данных и, таким образом, будет только преобразовывать данные в этот размер и хранить только данные такого размера. Это привело к тому, что у моего сервера всегда была правильная строка, чтобы получить доступ к объектам JSON.В основном, это была проблема указателя из-за отсутствия лучших слов в том смысле, что исходный код пытался получить доступ к большему, чем предполагалось, потому что он был открытым размером и копией и был слишком жадным значением, чтобы не допускать строку быть жадным.

Смежные вопросы