天气app的收获

server/2025/1/13 17:48:47/

天气app的收获

无论如何,是基于MVC模式,但都是从UI页面开始设计,然后根据输入的城市名称,将其传入到model层,进行相对应的处理。

对于controler层,需要通过一些协议完成一些输入的反馈,例如输入完后按回车键,或者是点击屏幕上相对应的按键,应该需要结束输入,这里就涉及到了委托模式,我们作为委托者,在VC中完成协议中的内容。

对于model层,首先是网络这个模块,我们需要调用API,这是首次接触这个东西,他会返回给我们一个JSON格式的内容,所以我们需要对其进行解码,然后还了解到了使用quick type 可以根据JSON生成的内容,快速生成对应的结构体,最后为了提高代码的复用性,我们在model层同意设置了委托,即对于model层而言,我并没有把其和controller层写死,而是让controler层遵循其中的协议,这样在未来可能会有其他地方使用model层,同样也只需要遵循协议即可。

回到controller层,我们需要更新UI,但显然,它崩溃了,这时候需要使用DispatchQueue.main.async

使用场景

​ 1. 更新 UI:

如果你在后台线程(例如网络请求、数据解析等)处理了某些任务,但需要更新 UI(如刷新标签、按钮或图像),你必须切换到主线程。

​ 2. 避免崩溃:

在非主线程上操作 UI 会导致应用崩溃,因此 DispatchQueue.main.async 可以安全地切换到主线程。

最后添加一个根据自身所在位置获得当前位置的天气

在 Swift 中,获取用户当前位置的步骤如下:

1. 导入必要的框架

需要导入 CoreLocation 框架,这是 iOS 中用于处理位置相关功能的框架。

import CoreLocation

2. 创建 CLLocationManager 实例

创建一个 CLLocationManager 对象,用于管理和获取位置信息。

3. 配置权限

请求用户授权获取位置信息。

​ • 在 Info.plist 文件中添加以下键,提示用户为什么需要位置服务:

​ • NSLocationWhenInUseUsageDescription(仅在应用程序使用时获取位置)

​ • 或 NSLocationAlwaysUsageDescription(应用程序始终获取位置)

然后在代码中请求权限:

let locationManager = CLLocationManager()locationManager.requestWhenInUseAuthorization()// 或者 locationManager.requestAlwaysAuthorization()

4. 设置 CLLocationManager 代理

实现代理方法以处理位置更新。

class ViewController: UIViewController, CLLocationManagerDelegate {let locationManager = CLLocationManager()override func viewDidLoad() {super.viewDidLoad()​     ​    // 设置代理​    locationManager.delegate = self​    locationManager.desiredAccuracy = kCLLocationAccuracyBest // 设置精度​    locationManager.requestWhenInUseAuthorization()      // 请求权限​    locationManager.startUpdatingLocation()          // 开始更新位置}// 处理位置更新func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {if let location = locations.last {print("纬度: \(location.coordinate.latitude), 经度: \(location.coordinate.longitude)")}}// 处理错误func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {print("获取位置失败: \(error.localizedDescription)")}}

5. 处理隐私和错误

​ • 如果用户拒绝授予权限,应用需要友好地提示用户。

​ • 在 locationManager(_:didFailWithError:) 中处理错误。

总结

完整的步骤包括:

​ 1. 导入 CoreLocation 框架。

​ 2. 创建 CLLocationManager 实例。

​ 3. 在 Info.plist 配置权限描述。

​ 4. 在代码中请求位置权限。

​ 5. 设置代理,监听位置更新。

​ 6. 处理位置更新和错误。

需要注意的是,我们在获取了当前位置的信息后,需要手动停止相关的调用。

​ 1. 持续触发 didUpdateLocations:

​ • 如果 stopUpdatingLocation() 不被调用,didUpdateLocations 会频繁调用,导致频繁地获取当前位置并调用 weathermanager.fetchWeather(latitude:longitutde:)。

​ • 这会覆盖用户输入的城市搜索结果,导致 UI 始终显示当前位置的天气信息,而不是用户想要查询的其他城市天气。

​ 2. 竞争条件

​ • resetPressed 和用户搜索功能共享同一个 weathermanager 实例。

​ • 如果 didUpdateLocations 继续触发,它可能在用户输入搜索城市后,立即再次覆盖 UI,造成用户感知上的问题。


http://www.ppmy.cn/server/158052.html

相关文章

Codeforces Round 995 (Div. 3)【题解】D ~ G

比赛地址传送门 D.Counting Pairs 注意到确定一个数后&#xff0c;第二个数可以一个范围内任选。故排序二分查找上下界后计数 #include <bits/stdc.h> #define int long long using namespace std; typedef pair<int, int> PII; const int N 4e5 10;int n, x, …

【Docker】入门教程

目录 一、Docker的安装 二、Docker的命令 Docker命令实验 1.下载镜像 2.启动容器 3.修改页面 4.保存镜像 5.分享社区 三、Docker存储 1.目录挂载 2.卷映射 四、Docker网络 1.容器间相互访问 2.Redis主从同步集群 3.启动MySQL 五、Docker Compose 1.命令式安装 …

嵌入式系统中的 OpenCV 与 OpenGLES 协同应用

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 一、OpenCV 在嵌入式中的基石地位二、OpenGLES 为嵌入式图形渲染赋能三、二者协同的精妙之处四、面临的挑战与应对策略 在嵌入式开…

人工智能-数据分析及特征提取思路

1、概况 基于学生行为数据预测是否涉黄、涉黑等。 2.数据分析 数据分析的意义包括得到数据得直觉、发掘潜在的结构、提取重要的变量、删除异常值、检验潜在的假设和建立初步的模型。 2.1数据质量分析 2.1.1数据值分析 查看数据类型&#xff1a; 首先明确各字段的数据类型…

QT中引入OpenCV库总结(qmake方式和cmake方式)

文章目录 前言opencv环境配置一、opencv库获取的两种方式二、qmake和cmake配置2.1、 qmake2.2、cmake2.2.1、引入opencv示例 三、qt与opencv对应关系四、问题 前言 我的软件环境&#xff0c;写在前面 Windows10QT5.12.12VS2017OpenCV4.5.4 opencv环境配置 一、opencv库获取…

Java手动打印执行过的sql

1. 拦截器 package com.xxx.platform.common.interceptor;import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import com.xxx.platform.common.aop.OLAPQuery; import com.xxx.platform.constant.CommonConstant; import com.xxx.platform.uti…

maven的生命周期

1.maven的生命周期是什么&#xff1f; Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一。 2.Maven中有3套相互独立的生命周期&#xff1a; clean&#xff1a;清理工作。 default&#xff1a;核心工作&#xff0c;如&#xff1a;编译、测试、打包、安装、部署等…

web-前端小实验5

实现以上图片中的内容 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&…