暑假第四周——天气预报仿写

ops/2024/12/23 1:19:22/

iOS学习

  • 前言
  • 简介
  • 首页
    • 简单的网络申请
  • 搜索功能
    • 添加功能
  • 详情
  • 总结

前言

作为最后一个项目,暑期培训也迎来了尾声。这个项目中初次尝试了网络申请,在iOS学习中迈出重要一步。


简介

该项目主要有搜索,预览,添加,详情几个功能组成。其中学习了引入第三方库以使用SVG图片,进行简单的网络申请实现模糊搜索等。

首页

请添加图片描述
该页面使用数组,储存城市的id以便进行网络申请。

简单的网络申请

网络申请分成五步

  • 创建请求地址
  • 创建请求类
  • 创建会话
  • 根据会话创建任务
  • 启动任务
-(void)creatURL
{//创建请求地址NSString *urlString1 = [NSString stringWithFormat:@"https://devapi.qweather.com/v7/weather/3d?location=%@&key=你的key",self.array_city[self.flag]];urlString1 = [urlString1 stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];NSURL *url1 = [NSURL URLWithString:urlString1];//创建请求类NSURLRequest *request1 = [NSURLRequest requestWithURL:url1];NSURLSessionConfiguration *config1 = [NSURLSessionConfiguration defaultSessionConfiguration];//创建会话NSURLSession *session1 = [NSURLSession sessionWithConfiguration:config1 delegate:self delegateQueue:[NSOperationQueue mainQueue]];//根据会话创建任务NSURLSessionTask *task1 = [session1 dataTaskWithRequest:request1];self.datatask01 = task1;//启动任务[task1 resume];}
//接受服务器响应
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{NSLog(@"didReceiveResponse");if(dataTask == self.datatask01) {if (self.data1 == nil) {self.data1 = [[NSMutableData alloc] init];} else {self.data1.length = 0;}}//允许数据接受completionHandler(NSURLSessionResponseAllow);
}//接收到数据,该方法会被调用多次-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{NSLog(@"didReceiveData");if (dataTask == self.datatask01) {[self.data1 appendData:data];}
}//数据请求完成或者请求出现错误调用的方法
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{NSLog(@"didCompleteWithError");// 在 URLSession:task:didCompleteWithError: 方法中if (task == self.datatask01) {if (error == nil) {NSMutableDictionary *dictBianYi = [NSJSONSerialization JSONObjectWithData:self.data1 options:kNilOptions error:nil];NSMutableArray *arrValue = [[NSMutableArray alloc] init];arrValue = dictBianYi[@"daily"];[self.arrWeNeed addObjectsFromArray:arrValue];} else {NSLog(@"errol = %@",error);}}if (task == self.datatask02) {if (error == nil) {NSMutableDictionary *dictBianYi = [NSJSONSerialization JSONObjectWithData:self.data2 options:kNilOptions error:nil];NSMutableDictionary *arrValue = [[NSMutableDictionary alloc] init];arrValue = dictBianYi[@"now"];NSString *str = arrValue[@"temp"];NSString *str_time = arrValue[@"obsTime"];[self.array_temp addObject:str];[self.array_time addObject:str_time];} else {NSLog(@"errol = %@",error);}NSLog(@"2");}if (task == self.datatask03) {if (error == nil) {NSMutableDictionary *dictBianYi = [NSJSONSerialization JSONObjectWithData:self.data3 options:kNilOptions error:nil];NSMutableArray *arrValue = [[NSMutableArray alloc] init];arrValue = dictBianYi[@"location"];[self.array_cityName addObject:arrValue[0][@"name"] ];[self.dictWeNeed_city addObjectsFromArray:arrValue];} else {NSLog(@"errol = %@",error);}NSLog(@"3");}self.number ++;if (self.number % 3 == 0) {//返回主线程调用[[NSOperationQueue mainQueue] addOperationWithBlock:^{//该代码块在返回主线程时调用,[self.tableView reloadData];}] ;}}

这就完成了简单的网络请求,网络请求得到的是json数据,是数组和字典的嵌套,如果看不懂可以在专门的网站中转化格式数据格式转换网站。
如果我们想要一次创建多个网络申请,只需在最后更新数据的时候,增加一个判断,当到我们需要的时候在更新数据即可。

搜索功能

效果:
请添加图片描述
该模糊搜索功能,通过在网络请求时,将搜索文本改为文本框的内容实现。

NSString *urlString = [NSString stringWithFormat:@"https://geoapi.qweather.com/v2/city/lookup?location=%@&key=3feab86d156d457b916ff85326e8593c",self.searchBar.text];urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];NSURL *url = [NSURL URLWithString:urlString];

添加功能

请添加图片描述
该功能主要使用了属性传值和协议传值的方法。点击搜索的单元格,通过属性传值进入详情页面。而协议传值则是使用协议,将需要添加的城市代码添加到城市数组中,并通过协议的方法传给主界面。
请添加图片描述
此处的判重采用将首页的城市数组传入该页面,判断该城市代码是否添加过。

-(void) press{int flag = 0;for (id object in self.array_city_serchNeed_in) {if ([object isEqualToString:self.str_city]) {flag = 1;break;}}if (flag == 0) {[self.dict setValue:self.str_city forKey:@"key"];[[NSNotificationCenter defaultCenter] postNotificationName:@"notice" object:nil userInfo:self.dict];NSLog(@"ID::%@",self.str_city);[self dismissViewControllerAnimated:YES completion:nil];} else {UIAlertController *alertVier  = [UIAlertController alertControllerWithTitle:@"提示" message:@"该城市已存在" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {}];[alertVier addAction:confirmAction];[self presentViewController:alertVier animated:YES completion:nil];}
}

详情

请添加图片描述
详情页面主要是使用SVG图片,需要通过CocoaPods引入第三方库。
使用方法为:

 NSString *svgFileName = [NSString stringWithFormat:@"/Users/liuyuanfu/Desktop/Icons-1.6.0/icons/%@.svg", iconName];NSURL *svgURL = [NSURL fileURLWithPath:svgFileName];if (svgURL) {SVGKImage *svgImage = [SVGKImage imageWithContentsOfURL:svgURL];if (svgImage) {// 将 SVG 图像转换为 UIImageUIImage *convertedImage = svgImage.UIImage;if (convertedImage) {// 将 UIImage 分配给 cell.imageView0.imagecell.imageView0.image = convertedImage;} else {//判断是否是转换失败NSLog(@"SVG 转换失败");}} else {// 判断是否为加载失败NSLog(@"SVG 加载失败");}}  else {NSLog(@"SVG 导入失败");}

总结

本次仿写刚开始的时候有很多的困难,网络申请有很多地方都看不懂,同时更新cell的时机也有很多的问题没考虑导致最后要改的地方很多。
但是在写完之后,还是学会了进行简单的网络申请以及引入第三方库。收获很多。


http://www.ppmy.cn/ops/110294.html

相关文章

Linux系统下配置和测试Redis服务

1. 打开Redis配置文件 这个命令使用nano文本编辑器打开Redis的配置文件。 sudo nano /etc/redis/redis.conf 2. 设置Redis绑定的IP地址 (redis.conf配置文件的内容)这个设置使Redis服务接受任何IP地址的连接。 bind 0.0.0.0 3. 设置Redis密码 &#xf…

SpringCloud-04 OpenFeign服务调用与负载均衡

OpenFeign是一个声明式、模板化的HTTP客户端,它简化了在Java应用程序中调用RESTful API的过程。OpenFeign是Netflix开发的一个开源项目,它构建在Feign的基础上,为开发者提供了更加简单、灵活的方式来实现HTTP请求。OpenFeign的特点包括&#…

Winform实现弹出定时框功能

1、程序 private void TimeDialogInitialize(){for(int i=1; i<30;i++){cbbTimeDialog.Items.Add(i);}}private void cbbTimeDialog_SelectedIndexChanged(object sender, EventArgs e){foreach(int i in cbbTimeDialog.Items){

C++入门(part 3)

前言 在前文我们讲解了C的诞生与历史&#xff0c;顺便讲解一些C的小语法&#xff0c;本文会继续讲解C的基础语法知识。 1.inline(内联函数) inline是C新加入的关键字,用inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用的地方将函数展开&#xff0c;这样每次…

从JVM角度看对象创建过程和内存布局

文章目录 从JVM角度看对象创建过程和内存布局 1.创建对象的方式2.创建对象的步骤2.1.对象判断2.2.分配内存2.3.处理并发问题2.4.初始化分配到的内存2.5. 设置对象的对象头2.6.执行init方法初始化 3.对象内存布局3.1.对象头3.1.1运行时元数据3.1.2.类型指针 3.2实例数据3.3.对齐…

Vue 中阻止点击事件穿透

在 Vue.js 应用中&#xff0c;处理用户交互是常见的需求&#xff0c;尤其是点击事件。然而&#xff0c;在某些情况下&#xff0c;我们可能需要阻止点击事件穿透到下层元素&#xff0c;这可以优化用户体验并防止不必要的事件处理。本文将探讨在 Vue 中如何有效地阻止点击事件穿透…

hive时间函数

一、随机示例&#xff08;想到哪里写哪里&#xff09; 1.系统时间函数 查询 select current_timestamp --当前格式化时间,current_date --当前格式化日期,unix_timestamp() --当前unix时间戳 结果&#xff1a; 2.时间函数转换 查询 --将时间戳转化为格式化时间 sel…

Java后端程序员简单操作Linux系统命令

Linux系统概述 Linux 内核最初是由芬兰人林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上 学时而编写的一个开源的操作系统。 Linux&#xff08;管理计算机硬件资源&#xff0c;任务调度&#xff09;支持多用户&#xff0c;支持网络&#xff0c;支持多线…