如何通过SwiftUI的.task修饰符基于位置或设置值更新视图?
解决方案
SwiftUI 的 .task 修饰符本身只接受单个 id 参数,但你可以通过组合元组的方式,把位置值和布尔设置值合并成一个复合 id,这样只要其中任意一个值发生变化,元组就会被判定为新的 id,从而触发 .task 重新执行。
具体实现代码如下:
... .task(id: (locationManager.currentLocation, someBoolForSetting)) { // 这里的代码会在位置变化 或 someBoolForSetting 变化时触发 ... }
原理说明
元组的相等性判断会遍历所有元素:只要 locationManager.currentLocation 或者 someBoolForSetting 其中一个值改变,整个元组就会被视为与之前不同的 id,.task 就会自动取消之前的任务(如果还在运行)并启动新的任务。
如果你的 currentLocation 是可选类型(比如 CLLocation?)也不用担心,Swift 会正确处理可选值的相等性对比,只要可选值的包裹内容变化,或者从 nil 变为非 nil(反之亦然),元组都会被判定为不同。
内容的提问来源于stack exchange,提问作者Nat
相关产品推荐
相关产品推荐

