2016-04-07 86 views
1

'dan dönüştürülürken null değerin Kullanıcı konumuna göre hava durumunu yayınlamak için Açık Hava Durumu API'sını kullanıyorum. İlk urllink adlı bir değişken yapıp http isteği değerine ayarlayın: NSString, NSURL

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

Sonra bir url için bu dizeyi dönüştürmek. Ben NSData nesneye bunu değiştirmek gerekir, çünkü geri dizeye url dönüştürün:

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 değişken NSURL mükemmel dönüştürür. Ancak, NSURL'u NSString'a dönüştürmeye çalıştığımda nil elde ederim. Hangi karşılığında NSData için nil verir.

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

bana jsonDataString için nil vererek:

Peki neden çizgidir?

+0

tarayıcınızdan ve url test olduğunu yapıştırmak vermedi:

asenkron ve raporlar hataları NSURLSession kullanmalıyım? Sonuç neydi ? –

+0

Evet yaptım. Bana doğru json ipini verdi. Yani her şey iyi çalıştı. –

cevap

4

mevcut olmayabilir. Böylece istek başarısız olur. Dahası, sadece doğrudan URLWithString kullanmalıdır:

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

sorun, initWithContentsOfURL kullanmakta olduğunuz hangi (a) senkron; ve (b) hataları bildirmiyor.

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

Hata mesajı gönderildi. URL'mde bir şey yanlıştır ve http :, web sitesinde http: ve işe yaramaz nedenini bilmiyor. Ama teşekkür ederim. –

+0

Evet, 'http: //' kabul edilir. Aslında, onların bağlantılarına kendi örneklerine bakarsanız, bu şema dahil olmaksızın size bunu gösterirler, ancak bağlantıya bakacak olursanız, http: // 'içerir. – Rob

0

muhtemelen bir asenk ihtiyaç verileri henüz URL'nize düzeni (https:// veya http://) eksik

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    // The code runs in background 

    do Some Long Operation 

}); 
+0

Async'i hiç kullanmadım. Nasıl kullanılacağını örnek gösterebilir misin? Ayrıca bu sadece bilgi için viewDidLoad'da oluyor. –

+0

Harici bir URL'ye sahip initWithContentsOfURL: 'öğesine yapılan bir çağrı, senkronize bir ağ isteği yapar; bu, tamamlanana kadar engelleneceği anlamına gelir. Yani sorun bu değil. @ Harsh.C, bu yöntemi kullanmak gibi eşzamanlı ağ istekleri genellikle önlenmelidir. – Gavin

+0

Başka bir seçenek. Nsurl nsdata almaktan düşünebilmemin tek yolu budur. –