天气预报项目总结
项目介绍
天气预报项目是一项涉及网络请求的应用,与之前的项目相比,最大的不同在于需要通过学习网络请求来获取实时的天气信息。项目主要包括天气预报界面、搜索城市界面以及保存城市的滚动视图。
天气预报界面
天气预报界面设计简洁,主页展示了当前城市的天气信息。通过点击城市cell,用户可以进入查看特定城市的详细天气信息。另外,界面中还包括一个用于切换到搜索城市界面的按钮,提供了便捷的城市搜索功能。
搜索城市界面
搜索城市界面包含一个文本输入框和一个动态变化的城市列表。在用户输入城市名的过程中,通过网络请求动态获取匹配的城市列表,将其显示在表格中。用户可以点击表格中的城市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];
// 创建请求类
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 创建会话
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
// 根据会话创建任务
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
// 启动任务
[dataTask resume];
}
需要注意的是,在搜索界面中,网络请求应该在文本输入框内容发生变化时触发。具体实现如下:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
[self creatUrl];
_cityArray = [[NSMutableArray alloc] init];
_xianshiArray = [[NSMutableArray alloc] init];
return YES;
}
网络请求的结果在接收服务器响应、接收数据、解析数据的过程中得以体现。下面是相关的协议函数:
// 接收服务器的响应
-(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];
// 在此进行操作
}
[_tableView reloadData];
}
在解析数据时,可以通过查看相应API返回的数据格式,使用NSJSONSerialization
进行解析,获取所需的天气信息。
收获
- 这个项目让我学习了一些新知识,例如网络请求,JSON解析数据等。
- 让我了解到了全局断点这个调试工具,很好用,但也不是万能的,后续还将继续积累调试经验
结语,这是笔者第一次接触到网络请求,后面一个项目知乎日报中,将会更深入的了解网络请求的知识,例如使用AFNetworking第三方库等,敬请期待