首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深度解读 Observation —— SwiftUI 性能提升新途径

在 WWDC 2023 中,苹果介绍了 Swift 标准库中新成员:Observation 框架。它出现有望缓解开发者长期面临 SwiftUI 视图无效更新问题。...访问博客 www.fatbobman.com[1] 可以获得更好阅读体验以及最新更新内容。...如何声明可观察对象 使用 Combine 框架,我们可以这样声明一个可被观察引用类型: class Store: ObservableObject { @Published var firstName...如何视图中使用可观察对象 在视图中声明可观察对象 与遵守 ObservableObject 协议 Source of Truth 不同,我们会在视图中使用 @State 来确保可观察对象声明周期。...Observation 是否解决了 ObservableObject 性能问题 是的,Observation 框架两方面改善了可观察对象在 SwiftUI 中性能表现: 通过观察视图可观察属性而不是可观察对象

47820
您找到你想要的搜索结果了吗?
是的
没有找到

为自定义属性包装类型添加类 @Published 能力

访问博客 www.fatbobman.com[1] 可以获得更好阅读体验 本文将对 @Published 与符合 ObservableObject 协议类实例之间沟通机制做以介绍,并通过三个示例...,但适用于 NSUbiquitousKeyValueStore ),来展示如何为其他自定义属性包装类型添加可访问包裹其类实例属性或方法能力。...调用包裹其类实例方法行为视为理所当然,从未认真想过它是如何实现。...本文中为其他属性包装类型添加类似 @Published 能力是指 —— 无需显式设置,属性包装类型便可访问包裹其类实例属性或方法。...@Published 能力秘密 Proposal 中找寻答案 我之前并不习惯于看 swift-evolution proposal[3],因为每当 Swift 推出新语言特性后,很多像例如

3.2K20

如何Swift 中取消一个后台任务

本文演示了如何明确地取消一个任务,并展示了子任务是如何自动取消。 该代码建立在在 Swift 中使用 async let 并行运行后台任务中编写AsyncLetApp之上。...模拟文件下载循环根据两个条件 for 循环更新为 while 循环: 取消标志值是 false 文件正在下载 这解决了这个问题,但是有一个额外标志来取消下载似乎太多余了。...Task 创建一个状态属性,并在下载按钮操作视图中将任务分配给该属性。...任务包括一个用于表示取消共享机制,但是没有一个关于如何处理取消共享实现。 这是因为任务取消方式会因任务正在执行操作而异。...此方法仍然使用Task状态属性。它被分配给下载按钮中 downloadFiles 函数,任务通过视图取消按钮取消。

2.7K30

用AsyncAwait重建SwiftURedux-like状态容器

用Async/Await重建SwiftURedux-like状态容器 本文介绍了如何使用Swift 5.5版本Async/Await功能重构SwiftUI状态容器代码。...•State(值类型)被保存在一个Store对象当中,为了在视图中注入方便,Store需符合ObservableObject协议,且为State设置@Published属性包装,保证State任何变化都将被及时响应...func reducer(action) } Reducer在处理Action时,经常会面对带有副作用(side effect)情况,比如: •需网络查询获得数据后,根据数据修改State•修改State...对状态(State)修改必须在主线程上进行,否则视图不会正常刷新。 我们构建状态容器(Store)需要满足处理上述情况能力。...,简化副作用代码 具体实现: @MainActorfinal class Store: ObservableObject { @Published private(set) var state

1.8K20

SwiftUI @State @Published @ObservedObject 深入理解和使用

@State 介绍 因为SwiftUI View 采用是结构体,当创建想要更改属性结构体方法时,我们需要添加mutating关键字,例如: mutating func doSomeWork() 然而...,Swift不允许我们创建可变计算属性,这意味着我们不能编写mutating var body: some View——这是不允许。...@State是专门为存储在一个视图简单属性而设计。因此,苹果建议我们向这些属性添加私有访问控制,比如:@State private var tapCount = 0。 2....") }) } } 3.最重要部分 (代码注释部分最为主要,务必看完) 虽然上面案例运行中什么都正常展示加载,但是到了实际项目中,却一堆bug,这是如何导致,如果对 这三种状态跟...@Published private var _lastUpdateTime: Date = Date() /// /// 通知更新 public func notifyUpdate

2.9K10

Swift 中使用 async let 并发运行后台任务

Async/await语法是在Swift 5.5 引入,在 WWDC 2021中 Meet async/await in Swift 对齐进行了介绍。...使用 "async let "是为了并行运行多个后台任务,并等待它们综合结果。 Swift异步编程是一种编写允许某些任务并发运行而不是按顺序运行代码方法。...请注意,由于DataFile模型是被视图监听,对模型任何改变都需要在UI线程上执行。这是通过使用 MainActor 队列来完成,即用MainActor.run包裹所有的模型更新。...视图被绑定到DataFiles数组,并更新显示每个文件下载进度。下载按钮被绑定到异步downloadFiles中。...在Swift并发中,这是用async let实现,它用一个承诺立即给一个变量赋值,允许代码执行下一行代码。然后,代码等待这些承诺,等待最终结果完成。

1.1K20

Ask Apple 2022 与 SwiftUI 有关问答(下)

访问博客 www.fatbobman.com[1] 可以获得更好阅读体验以及最新更新内容。...如何减少主线程负担Q:如何避免所有操作都被放置在主线上?任何标记 @Published 变量都应该在主线上被修改,所以应该使用 @MainActor 。但任何触及该属性代码都将被影响。...一般来说,性能瓶颈不在写入 @Published 属性周围。我建议方法是在主线程之外做任何昂贵或阻塞工作,然后只在需要写入 ObservableObject 上属性时再跳回主线程。...创建底部开始滚动视图Q:我如何实现一个在底部对齐滚动视图,在 macOS 上会不会有糟糕性能?...对于可能造成卡顿图片数据,放弃托管对象图片关系中直接获取方式。在 Cell 视图中,通过创建 request 私有上下文中提取数据并转换成图片。

14.7K30

掌握 SwiftUI task 修饰器

随着 Swift 5.5 引入了 async/await 特性,苹果也为 SwiftUI 添加了 task 视图修饰器,以方便开发者在视图中使用基于 async/await 异步代码。...原文发表于我博客 肘子Swift记事本 task vs onAppear SwiftUI 提供了两个版本 task 修饰器,版本一作用和调用时机与 onAppear 十分类似: public func...以下是 task 修饰器更加完整定义( swiftinterface 文件中获得 ): @inlinable public func task(priority: _Concurrency.TaskPriority...timer() async { print(Thread.current) // 仍然会运行于主线程 .... } } 我们可以通过将异步方法移到视图类型之外来解决这个问题...var date: Date = .now @Published var show = true @Sendable func timer() async {

3.5K60

Swift 5.6到5.10新特性整理

Swift 5.10 中,编译器只允许你在以下情况下并发上下文访问共享可变状态: 这个状态是不可变且符合 Sendable(在这里了解更多关于 Sendable 信息) 这个状态被隔离到一个全局...= $0 } 现在我们可以同时获得两者: let (stream, continuation) = AsyncStream.makeStream(of: String.self) 这在需要在当前上下文之外访问延续地方特别受欢迎...所以,我们可以创建一个新结果构建器,它知道如何接受一个视图,以及如何将该视图与另一个视图组合: @resultBuilder struct SimpleViewBuilderNew { static...: func synchronousCaller() { doRiskyWork() } 然而,如果我们尝试异步函数执行相同操作,Swift 将发出错误,因此这段代码将无法工作: func...这使得 JSON 输出更易于理解和在 Swift 之外使用。

1.4K10

SwiftUI:使用 @EnvironmentObject 环境中读取自定义值

如果我们使用@ObservedObject,则需要将我们对象每个视图传递到下一个视图,直到它最终到达可以使用该视图视图E,这很烦人,因为B,C和D不在乎它。...环境对象一个​​复杂性是其子对象构成,因为视图可以访问环境对象取决于其父视图。...例如,如果视图A可以访问环境对象,而视图B在视图A内部——即视图B放在Abody属性中——那么视图B也可以访问该环境对象。...首先,这是我们可以使用一些基本数据: class User: ObservableObject { @Published var name = "Taylor Swift" } 如您所见,使用...现在,您可能想知道SwiftUI如何在.environmentObject(user)和@EnvironmentObject var user: User之间建立连接——如何知道将该对象放入正确属性?

9.5K20

戴铭 Swift 小册子

建议使用我开发这个 macOS 程序来浏览,使用方法是: GitHub - ming1016/SwiftPamphletApp: 戴铭 Swift 小册子,一本活 Swift 手册 仓库拉代码...也就是函数里内可以定义函数,函数内定义函数可以访问自己作用域外函数内变量。...fileprivate:只能在源文件内访问。 private:只能在所在作用域内访问。 重写继承类成员,可以设置成员比父类这个成员更高访问级别。...private(set) var repos: [RepoModel] = [] @Published var isErrorShow = false @Published var errorMessage...另外通过 final 和 private 这样表示可将动态特性转化为静态方式,编译开启 WMO 可以自动推导出哪些动态派发可转化为静态派发。 如何避免崩溃?

2.1K30

避免 SwiftUI 视图重复计算

原文发表于我博客 肘子 Swift 记事本 视图状态构成 可以驱动视图进行更新源被称之为 Source of Truth,它类型有: 使用 @State、@StateObject 这类属性包装器声明变量...当 SwiftUI 将视图视图树上删除时,会一并完成对 SwiftUI 数据池以及关联清理工作。如此,使用 State 包装变量,其存续期将与视图存续期保持完全一致。...阅读如下文章,可以帮助你更好地理解本节内容:SwiftUI 视图生命周期研究、@state 研究、@StateObject 研究 避免非必要声明 任何可以在当前视图之外进行改动 Source...( 例如修改了使用 @Published 包装属性 ),所有与之相关联视图( 包括当前视图 )都会被刷新( 对 body 求值 )。...,可以考虑将闭包发送到后台队列 总结 本文介绍了一些在 SwiftUI 中如何避免造成视图重复计算技巧,除了从中查找是否有能解决你当前问题方法外,我更希望大家将关注点集中于这些技巧在背后对应原理。

9.2K81
领券