Ios 从NSURL转换时,NSString为null

Ios 从NSURL转换时,NSString为null,ios,json,nsstring,nsurl,Ios,Json,Nsstring,Nsurl,我正在使用开放天气API根据用户的位置获取实时天气。我首先创建一个名为urlink的变量,并将其设置为http请求: NSString *urllink = [NSString stringWithFormat:@"api.openweathermap.org/data/2.5/weather?lat=%f&lon=%f&appid=%@", lat, lng, WEATHERAPIKEY]; 然后我将该字符串转换为url。将url转换回字符串,因为我需要将其更改为NSData

我正在使用开放天气API根据用户的位置获取实时天气。我首先创建一个名为
urlink
的变量,并将其设置为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];
urlink
变量可以完美地转换为
NSURL
。但是当我尝试将
NSURL
转换为
NSString
时,我得到了
nil
。这反过来会给我
NSData
nil

那么,为什么这条线是:

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

对于
jsonDataString

给我
nil
,您可能需要一个异步的,数据可能还不存在

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // The code runs in background

    do Some Long Operation

});

您可能需要一个异步,数据可能还不存在

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // The code runs in background

    do Some Long Operation

});

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

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


您是否将该url粘贴到浏览器并进行了测试?结果如何?是的,我做了。它给了我正确的json字符串。所以一切都很好。你是否将该url粘贴到浏览器并进行了测试?结果如何?是的,我做了。它给了我正确的json字符串。所以一切都很好。我从未使用过异步。你能举例说明如何使用它吗?在viewDidLoad中也会发生这种情况,只是为了获取您的信息。使用外部URL调用
initWithContentsOfURL:
会发出同步网络请求,这意味着它将阻塞到完成。所以这不是问题所在。虽然@Harsh.C,但通常应避免使用同步网络请求,例如使用此方法。除此之外,还有什么其他选择。这是我能想到的从nsurl到nsdata的唯一方法。这个答案是错误的。长时间运行的任务应在后台队列中处理,与ui相关的任务应在主队列中处理queue@Harsh.C:您从未听说过NSURLConnection和NSURLSession?我从未使用过异步。你能举例说明如何使用它吗?在viewDidLoad中也会发生这种情况,只是为了获取您的信息。使用外部URL调用
initWithContentsOfURL:
会发出同步网络请求,这意味着它将阻塞到完成。所以这不是问题所在。虽然@Harsh.C,但通常应避免使用同步网络请求,例如使用此方法。除此之外,还有什么其他选择。这是我能想到的从nsurl到nsdata的唯一方法。这个答案是错误的。长时间运行的任务应在后台队列中处理,与ui相关的任务应在主队列中处理queue@Harsh.C:您从未听说过NSURLConnection和NSURLSession?谢谢,错误已发布。我的url有点问题,一定是http:,在他们的网站上他们不使用http;我不知道为什么。但是谢谢。是的,
http://
是假定的。事实上,如果你在他们的示例中查看他们的链接,他们会向你展示没有包含此方案的链接,但是如果你查看链接本身,它包含
http://
。谢谢你,错误已经发布。我的url有点问题,一定是http:,在他们的网站上他们不使用http;我不知道为什么。但是谢谢。是的,
http://
是假定的。事实上,如果您在示例中查看他们的链接,他们会在不包含此方案的情况下向您显示它,但是如果您查看链接本身,它包含
http://