从NSURL转换时,NSString为null

时间:2016-04-07 19:28:14

标签: ios json nsstring nsurl

我正在使用Open Weather API根据用户位置获取实时天气。我首先创建一个名为urllink的变量,并将其设置为等于http请求:

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

然后我将该字符串转换为网址。将url转换回字符串,因为我需要将其更改为NSData object:

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。但是当我尝试将NSURL转换为NSString时,我得nil。作为回报,我为nil提供了NSData

为什么这一行:

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

nil提供jsonDataString

2 个答案:

答案 0 :(得分:4)

您错过了网址中的方案(https://http://)。因此请求将失败。此外,您应该直接使用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];

问题是你正在使用initWithContentsOfURL,这是(a)同步的; (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];

答案 1 :(得分:0)

您可能需要异步,数据可能尚不存在

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // The code runs in background

    do Some Long Operation

});