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

iOS学习

前言

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


简介

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

首页

该页面使用数组,储存城市的id以便进行网络申请。

简单的网络申请

网络申请分成五步

  • 创建请求地址
  • 创建请求类
  • 创建会话
  • 根据会话创建任务
  • 启动任务
objectivec 复制代码
-(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];
        
    
}
objectivec 复制代码
//接受服务器响应
-(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数据,是数组和字典的嵌套,如果看不懂可以在专门的网站中转化格式数据格式转换网站

如果我们想要一次创建多个网络申请,只需在最后更新数据的时候,增加一个判断,当到我们需要的时候在更新数据即可。

搜索功能

效果:

该模糊搜索功能,通过在网络请求时,将搜索文本改为文本框的内容实现。

objectivec 复制代码
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];

添加功能

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

此处的判重采用将首页的城市数组传入该页面,判断该城市代码是否添加过。

objectivec 复制代码
-(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引入第三方库。

使用方法为:

objectivec 复制代码
 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 图像转换为 UIImage
                                    UIImage *convertedImage = svgImage.UIImage;
                                    if (convertedImage) {
                                        // 将 UIImage 分配给 cell.imageView0.image
                                        cell.imageView0.image = convertedImage;
                                    } else {
                                    //判断是否是转换失败
                                        NSLog(@"SVG 转换失败");
                                    }
                                } else {
                                    // 判断是否为加载失败
                                    NSLog(@"SVG 加载失败");
                                }
                            }  else {
                                NSLog(@"SVG 导入失败");
                            }

总结

本次仿写刚开始的时候有很多的困难,网络申请有很多地方都看不懂,同时更新cell的时机也有很多的问题没考虑导致最后要改的地方很多。

但是在写完之后,还是学会了进行简单的网络申请以及引入第三方库。收获很多。

相关推荐
SoraLuna8 小时前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
开发语言·macos·ui·华为·harmonyos
阿7_QuQ8 小时前
怎么在Windows上远程控制Mac电脑?
macos
小路恢弘14 小时前
使用Mac自带共享实现远程操作
macos
阿髙1 天前
macos 隐藏、加密磁盘、文件
macos
minos.cpp1 天前
Mac上Stable Diffusion的环境搭建(还算比较简单)
macos·ai作画·stable diffusion·aigc
追光天使2 天前
Mac/Linux 快速部署TiDB
linux·macos·tidb
wzkttt2 天前
Mac gfortran编译fortran出错
macos·gfortran
刘小哈哈哈2 天前
iOS 多个输入框弹出键盘处理
macos·ios·cocoa
草明2 天前
macOS 显示或不显示隐藏文件
macos
刘贤松2 天前
构建MacOS应用小白教程(打包 & 签名 & 公证 & 上架)
macos