当前位置: 首页 > article >正文

天气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.kler.cn/a/499938.html

相关文章:

  • Notepad++上NppFTP插件的安装和使用教程
  • 选择器css
  • 频域自适应空洞卷积FADC详解
  • Spring Boot 支持哪些日志框架
  • vue实现淘宝web端,装饰淘宝店铺APP,以及后端设计成能快速响应前端APP
  • # LeetCode 3270. 求出数字答案 —— Python 解题思路与实现
  • Spring Boot + Jasypt 实现application.yml 属性加密的快速示例
  • 【25考研】川大计算机复试情况,重点是啥?怎么准备?
  • 重新面试之JVM
  • 不同方式获取音频时长 - python 实现
  • Selenium python爬虫 是否需要设置浏览器窗口大小 ,有些按钮显示 不全会导致无法正常与这些元素进行交互
  • webpack03
  • 数据结构初阶---排序
  • 【机器学习篇】 科技异次元的超强 “魔杖”,开启奇幻新程
  • 金融项目实战 01|功能测试分析与设计
  • c++ 预备
  • 计算机基础知识复习1.5
  • cmake 编译ffmpeg的Android 的 so文件的cmake内容
  • 深度解析:语言模型的推理能力与强化学习优化
  • 人工智能与物联网:智慧城市的未来
  • 25/1/11 嵌入式笔记<esp32> 初入esp32
  • C语言二级考试