Domanda

Mi chiedevo perché dentro NSURLResponse in un sendSynchronousRequest Non riceverebbe informazioni ogni volta anche se non si sono verificate modifiche. Sembra che ci sia NSData essere ricevuto ma non viene convertito in una corda e quindi non viene convertito in un NSArray tramite la mia chiamata JSON. Il codice è di seguito. Il codice seguente è tutto in una singola funzione ma non sentire il nome necessario.

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");
}

Volevo aggiungere che il mio NSData L'oggetto mi dà gli stessi byte quando la connessione fallisce e quando funziona. Non sono sicuro che sia perché stanno usando lo stesso indirizzo di memoria, che ritengo che sarebbe completamente improbabile per il fatto che non c'è modo che il computer sia così fortunato quando riavvio l'app. Ad ogni modo, non ricevo alcun errore, ricevo una risposta e ricevo una sorta di dati ma il NSString non lo converte ogni volta per darmi un JSON che non è nullo.

Ho scoperto dopo aver fatto 1000 chiamate al server che la stringa che proviene dalla connessione convertita in un NSString Mi sta dando questo quando fallisce.

    [
          {
            "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

Il NSHTTPResponse Il codice di stato per Fail and Pass è 200, quindi anche la pagina si sta caricando ma questa risposta si verifica quando non riesco a recuperare un JSON. Posso effettuare più chiamate tramite il browser e avere questo lavoro bene. Android non manca di ottenere un JSON in tutto il tempo che stavo codificando con loro. Quindi due sistemi non mi danno questa risposta.

RISPONDERE:

La risposta a questo problema riguarda il NSString che viene utilizzato per convertire NSData Quello che dovrebbe essere c'è

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

Questo perché il modo originale nel codice ha la possibilità che la stringa provi ad accedere e archiviare le informazioni da indirizzi di memoria al di fuori delle dimensioni dei dati che sarebbero ancora in NSUTF8String formato. Quando si alloca la stringa, la stringa è solo la dimensione dei dati e quindi convertirà i dati solo in quella dimensione e memorizzerà solo i dati a quella dimensione.

Ciò ha fatto sì che la risposta del mio server abbia sempre la stringa corretta per accedere agli oggetti JSON. Fondamentalmente, era un problema di puntatore per mancanza di parole migliori, nel senso che il codice originale stava cercando di accedere più di quanto si supponesse perché era una dimensione e una copia aperta ed era un po 'troppo avido alloc non consentirà la stringa essere avido.

È stato utile?

Soluzione

RISPONDERE:

La risposta a questo problema riguarda il NSString che viene utilizzato per convertire NSData Quello che dovrebbe essere c'è

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

Questo perché il modo originale nel codice ha la possibilità che la stringa provi ad accedere e archiviare le informazioni da indirizzi di memoria al di fuori delle dimensioni dei dati che sarebbero ancora in NSUTF8String formato. Quando si alloc la stringa, la stringa è solo la dimensione dei dati e quindi convertirà i dati solo in quella dimensione e memorizzerà solo i dati a quella dimensione. Ciò ha fatto sì che la risposta del mio server abbia sempre la stringa corretta per accedere agli oggetti JSON. Fondamentalmente, era un problema di puntatore per mancanza di parole migliori, nel senso che il codice originale stava cercando di accedere più di quanto si supponesse perché era una dimensione e una copia aperta ed era un po 'troppo avido alloc non consentirà la stringa essere avido.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top