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

embedded/2024/12/22 9:18:43/

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/embedded/111472.html

相关文章

Unity Timeline

数据存储 TimeLine和Animation一样也是资源,以.playable的格式存储,可以通过Playable Director进行加载播放。 Playable具有以下优势: 结构简单; 运行时创建、添加和删除; 更加灵活,可以直接控制动画的各种…

centos/kali 操作不同(两处)

二进制包安装 centos7: rpm包 rpm -ivhkali: deban包 dpkg -i deb包 网络镜像源配置 centos7: 配置文件路径 /etc/yum.repos.d 配置镜像源,会生成 .repo为后缀的文件,文件内容格式: [后缀.repo四部----------------…

HTTPS安全吗?3个理由告诉你HTTPS为什么是安全的!

从保护银行网站到在线购物期间保护数据,HTTPS协议在互联网上随处可见。例如当您访问racent.com时,你会发现你是通过安全加密链接来访问网站的。这种安全链接会触发浏览器的网址栏旁边显示安全挂锁图标。 但HTTPS真的安全吗? 如果你想快速得到答案&…

blender软件下载地址,blender哪个版本好用

​blender软件下载 不废话,blender软件下载直接点:https://download.blender.org/release/ blender最新稳定版:Blender 4.2.1 LTS 【渲染101云渲染】:如果您希望使用Blender的最新功能,并且愿意接受可能存在的一些小…

下载docker镜像报错,dial tcp x.x.x.x:443: connect: connection refused

原因是:国外的连接超时了. 解决方案改为阿里云的数据源 打开阿里云 搜索&#xff1a;容器镜像服务 ACR 把你自己的这个直接复制在linux sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF { "registry-mirrors": ["你自己的"] }…

在VB.net中,TimeSpan有什么属性与方法

标题 在VB.net中&#xff0c;TimeSpan有什么属性与方法 正文 在 VB.NET 中&#xff0c;TimeSpan 结构表示时间间隔&#xff0c;即一段时间&#xff0c;而不表示特定的时间点。TimeSpan 提供了多种属性来获取时间间隔的各个组成部分&#xff0c;以及一些方法来操作这些时间间隔。…

1111111

1111111111111

VIT论文阅读

把图片看成一个个16x16的patch堆起来的 摘要 卷积神经网络不是必备的&#xff0c;一个纯transformer表现也是非常好的 transformer&#xff1f;2500天tpu v3 介绍 大规模上预训练&#xff0c;小规模任务数据集上微调。扩大模型时候还没观察到瓶颈&#xff08;还没出现过拟合…