swiftui - ObservableObject 中的@Published 和普通 AnyPublisher 属性有什么区别
问题描述
我考虑有什么区别
@Published var isLoggedIn: Bool = false
var isLoggedIn: AnyPublisher<Bool, Never>
我知道在第一次的情况下,我可以直接在 SwiftUI View 中使用它,即使用 $ 符号创建绑定,然后例如使用if $isLoggedIn.animation()
但是我怎样才能达到同样的效果AnyPublisher<Bool, Never>
,似乎我需要在某处调用assign或sink和store()。让它发挥作用。所以在 SwiftUI 中创建绑定似乎是不可能的if $isLoggedIn.animation
@Published 的限制是我不能在那里进行自定义观察。例如,我可以通过 UserDefaults.publisher 中的 AnyPublisher 执行 UserDefaults。
现在看来我需要同时拥有并进行AnyPublisher
更新@Published var
但是我认为@Published 是位于常规 AnyPublisher 之下的属性包装器,所以为什么我不能直接从 AnyPublisher 在 SwiftUI 视图中进行绑定?
解决方案
Combine's@Published
是一个由属性包装器包装的发布者。这为其$
提供了 SwiftUI 所依赖的前缀属性和其他功能。
一个@Published
属性也根本不像一个AnyPublisher
。@Published
总是有Never
作为它的故障类型,AnyPublisher
可以有其他故障情况。
@Published
具有状态感/当前值,而AnyPublisher
. ACurrentValueSubject
会最接近,但这不起作用,因为@Published
它可以用作CurrentValueSubject
. 一个重要的区别是 SwiftUI 可以@Published
直接为属性分配新值(isLoggedIn = true
会在此处触发更改)。
要在 SwiftUI 中与您的发布者合作,您需要将他们的值分配给@Published
您在原始问题中提到的专用属性。
推荐阅读
- c# - C# Windows 服务无法启动:“无法从命令行或调试器启动服务”
- java - 具有集成测试的通用库中的 Flyway
- ios - 如何修复 nw_protocol_boringssl_get_output_frames(1301) [C6.1:2][0x7fc1e7a0ead0] 获取输出帧失败,
- javascript - 使用 react-infinite-scroller 创建待办事项列表
- r - 如何将数据集的整数变量的级别转换为字符串字符
- c - 扩展整数类型的示例?
- javascript - 如何使用“请求”库在 HTTP 请求中将查询字符串作为参数传递
- excel - 如何将数字截断为前八位?
- c# - 需要 ASP.NET 中 AddRemoteScheme 的示例实现
- c++ - 如何使用 FFTW 和 SDL_mixer 库执行 FFT