NSURLResponse не всегда получает данные - PullRequest
2 голосов
/ 20 февраля 2012

Мне было интересно, почему в 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 Ответ

1 голос
/ 13 апреля 2012

ОТВЕТ:

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

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

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

...