从 NSURL 转换时 NSString 为 null
NSString is null when converted from a 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
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
。 return 中 NSData
的 nil
。
那为什么是这条线:
NSString *jsonDataString = [[NSString alloc]initWithContentsOfURL:jsonURL];
给我 nil
jsonDataString
?
您可能需要异步,数据可能还不存在
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];
我正在使用 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
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
。 return 中 NSData
的 nil
。
那为什么是这条线:
NSString *jsonDataString = [[NSString alloc]initWithContentsOfURL:jsonURL];
给我 nil
jsonDataString
?
您可能需要异步,数据可能还不存在
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];