Ios 从NSURL转换时,NSString为null
我正在使用开放天气API根据用户的位置获取实时天气。我首先创建一个名为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
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://
。