2016-04-07 19 views
1

Open Weather APIを使用して、ユーザーの場所に応じてライブ天気を取得しています。それから私は、URLにその文字列を変換NSStringから変換されたときにNSStringがnullになる

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

:私は最初urllinkという変数を作成し、httpリクエストにそれが等しくなるように設定します。私はNSDataオブジェクトにそれを変更する必要があるため、バック文字列にURLを変換します

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]; 

urllink変数がNSURLに完全に変換されます。しかし、NSURLNSStringに変換しようとすると、nilとなります。その代償としてNSDataの場合はnilとなります。

なぜラインです:

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

は私にjsonDataStringためnilを与えますか?あなたはおそらく非同期が必要

+0

ブラウザにそのURLを貼り付け、テストしたのですか?結果は何でしたか? –

+0

はい、私はしました。それは私に正しいjson文字列を与えました。だからすべてうまくいった。 –

答えて

4

存在しないかもしれません。したがって、要求は失敗します。さらに、あなただけの直接URLWithStringを使用する必要があります。

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]; 

問題は、あなたが(a)に同期しているinitWithContentsOfURLを、使用しているということです。 (b)エラーを報告しない。

あなたは非同期であり、エラーが報告されているNSURLSessionを使用する必要があります:あなたは

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

ありがとうございました。何かが私のURLに間違っていて、それはhttp:でなければなりません、彼らのウェブサイトではhttpを使用しません。それはなぜか分からない。でもありがとう。 –

+0

ええ、 'http://'が仮定されています。実際には、例のリンクを見ると、このスキームは含まれていませんが、リンク自体を見ると 'http:// 'が含まれています。 – Rob

0

、データはまだあなたのURLにスキーム(https://またはhttp://)が欠けている

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    // The code runs in background 

    do Some Long Operation 

}); 
+0

私は非同期を一度も使用していません。それを使用する方法の例を表示できますか?また、これはあなたの情報だけのためにviewDidLoadで起こっています。 –

+0

外部URLを持つ 'initWithContentsOfURL:'を呼び出すと、同期ネットワーク要求が行われます。つまり、完了するまでブロックされます。だからそれは問題ではない。 @ Harsh.Cでは、この方法を使用するなどの同期ネットワーク要求は一般的に避けなければなりません。 – Gavin

+0

よりも別のオプションがあります。それはnsurlからnsdataになることから考えることができる唯一の方法です。 –

関連する問題