最近在整理各种关于天气获取的方法,现在将学习到的东西进行总结。其实,天气获取的实例,主要分为两个部分,第一个部分就是通过网络获取到数据,第二个 部分是获取到数据后的分析处理。处理之后就是你自己开发的程序的问题,如何显示得更加的漂亮。
接口网站
http://www.webxml.com.cn/zh_cn/index.aspx
http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx
第一个部分关于数据获取。
通过网络获取数据的方法,有两种,一种是通过NSRUL,NSURLREQUEST,NSURLCONNECTION的方法获取。另一种方法是直接通过NSData的initContentwithURL或dataWithContentsOfURL的方法。
描述如下:
方法1:
NSString *googleURL = @"http://www.weather.com.cn/data/cityinfo/101070101.html";
NSURL *url = [NSURL URLWithString:googleURL];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection release];
[request release];
委托的处理方法:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
outString = [[NSString alloc] initWithData:data encoding: NSUTF8StringEncoding];
NSLog(@"%@", outString);
}
-(void) connection:(NSURLConnection *)connection
didFailWithError: (NSError *)error {
}
- (void) connectionDidFinishLoading: (NSURLConnection*) connection {
}
方法2:
#define kWeatherServiceURLStr @"http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?heCityName="
NSString *RequestUrlStr = [NSString stringWithFormat:@"%@%@",kWeatherServiceURLStr,[[ipCityLocation citySimpleName] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"request = %@", RequestUrlStr);
NSData * ReponseData = [NSData dataWithContentsOfURL:[NSURL URLWithString:RequestUrlStr]];
第二部分为获取数据后的,数据分析,数据部分通常来讲也有两种方法,第一种是获取到的数据为JSON,第二种方法获取到的数据为XML。
方法1:获取到的数据为JSON。
iOS5之前并没有提供比较好的JSON类库,但是ios5之后就提供了一种公共的方法NSJSONSerialization,而为了保证ios5之前的方法也可以使用,需要使用的第三方库有SBJson和TouchJSON。不过好像SBJson用的人比较多。具体方法实例如下:
TouchJSON:
//获取API接口
1、取值时发生应用程序崩溃,获取值不正确
有时我们从字典中获取了这样的数据,感觉比较郁闷,并未显示中文,这种情况是我们把数据放到字典中,编码方式是UTF8,取值打印出来的时候就成中文了
在解析出来数据后我想这样取值,
NSDictionary*weatherInfo = [rootDicobjectForKey:@"weatherinfo"];
NSArray*weatherArray = [rootDicobjectForKey:@"weatherinfo"];
for(NSDictionary*dicinweatherArray) {
NSLog(@"----->%@",dic);
}
打印出来的dic数据是这样的 这是我们json文件的第二层数据取出放到了一个数组中,然后定义了一个字典对象在数组中遍历取出存放的数据,于是就想用
NSLog(@"----->%@",[dicobjectForKey:@"city"]);来取出city的值,但是应用程序崩溃
出现这种情况是因为在对解析出数据存值和取值发生问题,说明这种方式是取值是不正确的;xmlParser = [[NSXMLParser alloc] initWithData:weatherReponseData];
[xmlParser setDelegate:self];
[xmlParser setShouldProcessNamespaces:NO];
[xmlParser setShouldReportNamespacePrefixes:NO];
[xmlParser setShouldResolveExternalEntities:NO];
// 启动解析命令
- (void)startParse{
// 开始解析
[xmlParser parse];
}
// 设定委托方法
#pragma mark NSXMLParserDelegate
#pragma mark xml parser delegate
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSCharacterSet *whitespace = [NSCharacterSet whitespaceCharacterSet];
string = [string stringByTrimmingCharactersInSet:whitespace];
if (![string isEqualToString:@"\n"]) {
[xmlWeatherStringArray addObject:string];
}
}
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
NSLog(@"%@", [parseError description]);
}
- (void)parserDidEndDocument:(NSXMLParser *)parser{
[self outputParseInfo];
//取出xml中数据后提取信息
[self splitXmlWeatherInfo];
}