天气预报总结
天气预报和之前项目最大的区别就是天气预报需要学习网络请求才能完成,天气预报界面并不复杂,在学习网络请求时就花费了两天时间,我们先来看看界面:
首页首先就去就有一个城市的信息,城市cell可以点击进去切换到查看界面,第二个cell里有一个button控制视图切换到搜索界面,要注意的是,这一页的tableView的行数是当前页城市个数,因此在传值回来时要记得更新,点击加号进入搜索界面:
搜索界面一个textfield和一个tableview,这个tableview内容同样是动态的,根据网络请求城市的个数来确定tableView行数,并把请求到的数据显示上去,点击cell即可进入相关城市查看:
两边分别有取消和保存按钮,点击保存先判断是否已经有此城市,如果没有即可回到主界面并保存。
从主界面的城市cell点进去是一个滚动视图,查看所保存的所有城市天气状态,可左右滑动切换:
最重要的一点,关于网络请求:
网络请求
创建网络请求的五大步骤:
创建请求地址
创建请求类
创建会话
根据会话创建任务
启动任务
- (void)creatUrl {
NSString *urlString = [NSString stringWithFormat:@"https://geoapi.heweather.net/v2/city/lookup?location=%@&key=b92646e0f4194731b50870798cfad1d0", _textField.text];
urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSURL *url = [NSURL URLWithString:urlString];
//2.创建请求类
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.创建会话
//delegateQueue 表示协议方法在哪个线程中执行
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//4.根据会话创建任务
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
//5.启动任务
[dataTask resume];
}
要注意的是网络请求的位置,以搜索界面为例,创建网络请求应该在textfield输入过程中,只要textfield内容改变就应该改变网络请求。
如下:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
[self creatUrl];
_cityArray = [[NSMutableArray alloc] init];
_xianshiArray = [[NSMutableArray alloc] init];
return YES;
}
在creatUrl之后要完成相应的协议函数进行接受服务器响应,接受数据,对数据进行解析的过程。
//接收服务器的响应
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {
if(self.data == nil){
self.data = [[NSMutableData alloc] init];
} else {
self.data.length = 0;
}
completionHandler(NSURLSessionResponseAllow);
}
//接收到数据,该方法会被调用多次
- (void)URLSession:(NSURLSession *)session dataTask:( NSURLSessionDataTask *)dataTask didReceiveData:( NSData *)data {
[self.data appendData:data];
}
然后要重点强调接受数据的过程:
//数据请求完成或者请求出现错误调用的方法
- (void)URLSession:(NSURLSession *)session task:( NSURLSessionTask *)task didCompleteWithError:( NSError *)error {
if (error == nil) {
//解析数据
NSDictionary *secondDictionary = [NSJSONSerialization JSONObjectWithData:_data options:kNilOptions error:nil];
//NSLog(@"%@",secondDictionary);
NSMutableArray *timeArray = [[NSMutableArray alloc] init];
timeArray = secondDictionary[@"location"];
//在此进行操作
}
}
[_tableView reloadData];
}
对于数据的操作我刚开始一直看不明白,后来经过学长的指导才明白这个过程,进入API界面,以西安为例,可以看到:
有的API可能会显示乱码,把它放在其他浏览器或手机上进入,得到此界面,将内容复制粘贴过来,到JSON翻译网站JSON在线解析
得到如下结果:
代码中的secondDictionary即为获取的数据,如果我们想获取图上name:西安这个数据,代码表示为:
NSMutableString *str = [NSMutableString stringWithFormat:@"%@",secondDictionary[@"location"][0][@"name"]];
将这个数据进行相应赋值即可,对于其他数据也是这个方法完成。