ios - 从 NSURL 转换时 NSString 为空

标签 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。将 url 转换回字符串,因为我需要将其更改为 NSData目的:
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 .这反过来给了我nil对于 NSData .

那么为什么是这条线:
 NSString *jsonDataString  = [[NSString alloc]initWithContentsOfURL:jsonURL];

给我nil对于 jsonDataString ?

最佳答案

您的 URL 中缺少方案(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];

关于ios - 从 NSURL 转换时 NSString 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36485453/

相关文章:

ios - 如何在ios中实现刷新 token

ios - Audiokit 绘制出 View 中的波形

ios - objective-C 如何为类声明私有(private)属性?

ios - 当NavigationController推送到TabBarController时,为什么在第一个选项卡栏项目之后,TableViewController的contentInset是错误的

javascript - 如何使用 javascript 迭代 JSON 文件?

ios - 我可以在ios中限制capitalizedString不将上标文本大写吗

ios - 为什么可访问性将 NSString 属性添加为静态文本?以及如何忽略它?

java - 如何使用 Jquery 按值而不是按键打印 HashMap

json - 如何保证ServiceStack始终返回JSON?

ios - 将 NSString 转换为 NSDictionary