天气app的收获

天气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.mzph.cn/diannao/66824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL技术内幕22:vacuum full 和 vacuum

文章目录 0.简介1.概念及使用方式2.工作原理2.1 主要功能2.2 清理流程2.3 防止事务id环绕说明 3.使用建议 0.简介 在之前介绍MVCC文章中介绍过常见的MVCC实现的两种方式,一种是将旧数据放到回滚段,一种是直接生成一条新数据(对于删除是不删除…

【面试】程序员 简历

一、简历整体结构 完整简历包含基本信息、教育背景、求职意向、工作经历、职业技能、项目经历、个人优势和个人荣誉八个部分。编写时,前几部分在保证真实的基础上可适当美化;个人优势和荣誉描述要突出难点亮点且避免夸张,可写入如马拉松参赛、…

WebGIS在应急灾害中对村庄、风景区、机场的影响范围应用-以日喀则市定日县地震为例

目录 前言 一、关于影响范围 1、震中距离5公里 2、震中20公里范围 3、20到80公里范围 二、空间查询知识 1、相关数据介绍 2、空间数据查询 三、前后端数据查询以及web可视化实现 1、后台API实现 2、WebGIS前端实现 四、Web成果展示 1、空间位置分析 2、包含风景区…

【UE5 C++课程系列笔记】27——多线程基础——ControlFlow插件的基本使用

目录 步骤 一、搭建基本同步框架 二、添加委托 三、添加蓝图互动框架 四、修改为异步框架 完整代码 通过一个游戏初始化流程的示例来介绍“ControlFlows”的基本使用。 步骤 一、搭建基本同步框架 1. 勾选“ControlFlows”插件 2. 新建一个空白C类,这里…

JavaEE之定时器及自我实现

在生活当中,有很多事情,我们不是立马就去做,而是在规定了时间之后,在到该时间时,再去执行,比如:闹钟、定时关机等等,在程序的世界中,有些代码也不是立刻执行,…

国产3D CAD将逐步取代国外软件

在工业软件的关键领域,计算机辅助设计(CAD)软件对于制造业的重要性不言而喻。近年来,国产 CAD 的发展态势迅猛,展现出巨大的潜力与机遇,正逐步改变着 CAD 市场长期由国外软件主导的格局。 国产CAD发展现状 …

linux:文件的创建/删除/复制/移动/查看/查找/权限/类型/压缩/打包

关于文件的关键词 创建 touch 删除 rm 复制 cp 权限 chmod 移动 mv 查看内容 cat(全部); head(前10行); tail(末尾10行); more,less 查找 find 压缩 gzip ; bzip 打包 tar 编辑 sed 创建文件 格式: touch 文件名 删除文件 复制文件 移动文件 查看文…

数据结构C语言描述11(图文结合)--二叉搜索树(BST树)的实现(数据采用KV存储形式进行封装)

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法;有C基础即可跟着学习,代码均可运行;准备考研的也可跟着写,个人感觉,如果时间充裕,手写一遍比看书、刷题管用很多,这也是本人采用纯C语言…

Chrome_60.0.3112.113_x64 单文件版 下载

单文件,免安装,直接用~ Google Chrome, 免費下載. Google Chrome 60.0.3112.113: Chrome 是 Google 開發的網路瀏覽器。它的特點是速度快,功能多。 下载地址: https://blog.s3.sh.cn/thread-150-1-1.htmlhttps://blog.s3.sh.cn/thread-150-1-1.html

概率论与数理统计总复习

复习课本:中科大使用的教辅《概率论和数理统计》缪柏其、张伟平版本 目录 0.部分积分公式 1.容斥原理 2.条件概率 3.全概率公式 4.贝叶斯公式 5.独立性 6.伯努利分布(两点分布) 7.二项分布 8.帕斯卡分布(负二项分布&am…

【线性代数】通俗理解特征向量与特征值

这一块在线性代数中属于重点且较难理解的内容,下面仅个人学习过程中的体会,错误之处欢迎指出,有更简洁易懂的理解方式也欢迎留言学习。 文章目录 概念计算几何直观理解意义PS.适用 概念 矩阵本身就是一个线性变换,对一个空间中的…

IDEA中创建maven项目

1. IDEA中创建maven项目 在IDEA中创建Maven项目,前提是已经安装配置好Maven环境。如还未配置安装Maven的,请先下载安装。如何下载安装,可参考我另外篇文章:maven的下载与安装教程本篇教程是以创建基于servlet的JavaWeb项目为例子&…

windows记事本不显示下划线

问题已解决 问题复现 解决方法 原因特定情况下默认的字体大小会导致下划线不可见,只需crtl加号的快捷键或者ctrl前或者后滚动鼠标滚轮以改变字体大小即可

git问题

拉取项目代码后,出现 1、找回未commit的代码 2、记录不全,只是显示部分代码记录

Operation001-Install

操作001:RabbitMQ安装 一、安装 # 拉取镜像 docker pull rabbitmq:3.13-management# -d 参数:后台运行 Docker 容器 # --name 参数:设置容器名称 # -p 参数:映射端口号,格式是“宿主机端口号:容器内端口号”。5672供…

rom定制系列------小米max3安卓12 miui14批量线刷 默认开启usb功能选项 插电自启等

小米Max3是小米公司于2018年7月19日发布的机型。此机型后在没有max新型号。采用全金属一体机身设计,配备6.9英寸全面屏.八核处理器骁龙636,后置双摄像头1200万500万像素,前置800万像素.机型代码 :nitrogen.官方最终版为稳定版12.5…

Vue3学习-day3

computed计算属性函数 计算属性小案例 App.vue <script setup> import { ref, computed } from vue// 声明数据 const list ref([1,2,3,4,5,6,7,8])// 基于list派生一个计算属性&#xff0c;从list中过滤出 > 2 const setList computed(() > {return list.val…

【博主推荐】VUE常见问题及解决方案

文章目录 1.找不到模块“../views/index.vue”或其相应的类型声明。ts(2307)2.当改变 Vue 实例中的数据时&#xff0c;视图没有相应地更新3.在某些复杂的异步操作或者多个数据交互场景下&#xff0c;数据绑定的更新在时间上出现延迟4.父组件无法将数据正确地传递给子组件&#…

完整化安装kubesphere,ks-jenkins的状态一直为init

错误描述&#xff1a; 打印日志&#xff1a; kubectl describe pod ks-jenkins-7fcff7857b-gh4g5 -n kubesphere-devops-system 日志描述如下&#xff1a; Events: Type Reason Age From Message ---- ------ ---- …

1.UGUI相关

1.这一种UIcanvas下的组件,会显示在3d物体之前 2.可以设置3d物体在UI界面之前。选中第二个模式。这时候会指定一个摄像机。一般情况下&#xff0c;不用主摄像机。需要新建一个专门给UI的摄像机。相当于设置距离摄像机的远近。两个layer 可以理解成 章节&#xff0c;关卡。相同…