2016-04-07 6 views
1

Ich verwende die Open Weather API, um Live-Wetter abhängig vom Standort des Benutzers zu erhalten. Ich mache zuerst eine Variable urllink und legen Sie es gleich der HTTP-Anforderung genannt:NSString ist null, wenn es von einem NSURL konvertiert wird

NSString *urllink = [NSString stringWithFormat:@"api.openweathermap.org/data/2.5/weather?lat=%f&lon=%f&appid=%@", lat, lng, WEATHERAPIKEY]; 

Dann konvertiere ich diese Zeichenfolge zu einer URL. Konvertieren url zurück zu bespannen, weil ich es zu NSData Objekt ändern müssen:

NSURL *jsonURL = [NSURL URLWithString:[self urlEncodeValue:urllink]]; 
NSString *jsonDataString = [[NSString alloc]initWithContentsOfURL:jsonURL]; // error on this line 
NSLog(@"This is jsonDataString:%@", jsonDataString); 
NSData *jsonData = [jsonDataString dataUsingEncoding:NSUTF8StringEncoding]; 

Die urllink Variable konvertiert perfekt NSURL. Aber wenn ich versuche, die NSURL zu NSString zu konvertieren, bekomme ich nil. Das gibt mir nil für NSData.

Warum ist die Zeile:

NSString *jsonDataString = [[NSString alloc]initWithContentsOfURL:jsonURL]; 

mich nil für jsonDataString geben?

+0

haben Sie fügen die URL zu Ihrem Browser und getestet? Was war das Ergebnis ? –

+0

Ja, tat ich. Es gab mir die richtige JSON-Zeichenfolge. Also alles hat gut funktioniert. –

Antwort

4

Sie vermissen das Schema (die https:// oder http://) in der URL vorhanden sein. Daher wird die Anfrage fehlschlagen. Darüber hinaus sollten Sie nur URLWithString direkt verwenden:

NSString *urllink = [NSString stringWithFormat:@"http://api.openweathermap.org/data/2.5/weather?lat=%f&lon=%f&appid=%@", lat, lng, WEATHERAPIKEY]; 

NSURL *jsonURL = [NSURL URLWithString:urllink]; 

Das Problem ist, dass Sie initWithContentsOfURL verwenden, die (a) synchron; und (b) meldet keine Fehler.

sollten Sie NSURLSession verwenden, die Fehler asynchron und Berichte ist:

NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:jsonURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    if (data == nil || error != nil) { 
     NSLog(@"error: %@", error); 
     return; 
    } 

    NSError *parseError; 
    NSDictionary *responseObject = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError]; 
    if (responseObject) { 
     NSLog(@"responseObject = %@", responseObject); 
    } else { 
     NSLog(@"parseError: %@", parseError); 
     NSLog(@"responseString: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 
    } 
}]; 
[task resume]; 
+0

Danke der Fehler wird gepostet. Etwas stimmt nicht mit meiner URL und es muss das http sein: Auf ihrer Website benutzen sie nicht das http; und es funktioniert, weiß nicht warum. Aber danke. –

+0

Ja, das 'http: //' wird angenommen. In der Tat, wenn Sie ihre Links in ihren Beispielen betrachten, zeigen sie Ihnen es ohne dieses Schema enthalten, aber wenn Sie den Link selbst betrachten, enthält es 'http: //'. – Rob

0

Sie wahrscheinlich eine async benötigen, Daten möglicherweise noch nicht

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    // The code runs in background 

    do Some Long Operation 

}); 
+0

Ich habe noch nie einen Async verwendet. Können Sie ein Beispiel zeigen, wie man es benutzt? Auch dies geschieht in ViewDidLoad nur für Ihre Informationen. –

+0

Ein Aufruf von 'initWithContentsOfURL:' mit einer externen URL führt zu einer synchronen Netzwerkanforderung, was bedeutet, dass sie bis zum Abschluss blockiert wird. Das ist also nicht das Problem. Obwohl @ Harsh.C, sollten synchrone Netzwerkanforderungen, wie die Verwendung dieser Methode, generell vermieden werden. – Gavin

+0

Was ist eine andere Option als. Das ist der einzige Weg, den ich mir vorstellen kann, wenn ich von nsurl zu nsdata komme. –