问题标签 [combine]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift - RunLoop 与 DispatchQueue 作为调度程序
使用新的组合框架时,您可以指定从发布者接收元素的调度程序。
在将发布者分配给 UI 元素时,RunLoop.main
和在这种情况下是否有很大区别?DispatchQueue.main
第一个返回主线程的运行循环和与主线程关联的第二个队列。
swift - 多个 UITextFields 和 textDidChangeNotification 通知
我最近在玩 Combine 框架,想知道是否可以创建一些智能扩展来作为 Publisher 获取文本更改。
假设我有两个 UITextField:
其中第一个和第二个变量只是`@Published var first/second: String = ""
这不起作用,因为我使用的是 NotificationCenter 的共享实例,因此当我对任何 textFields 进行任何更改时,它会将新值传播到两个sink
闭包。你认为有什么方法可以实现类似于rx.text
RxSwift 中可用的东西吗?我正在考虑使用addTarget
with 闭包,但它需要使用来自 Objective-C 的关联对象。
swift - “PassthroughSubject”似乎是线程不安全的,这是错误还是限制?
“PassthroughSubject”似乎是线程不安全的。请参阅下面的代码,我同时向仅请求的订阅者发送 100 个值.max(5)
。我认为订阅者应该只得到 5 个值,但实际上它得到了更多。这是错误还是限制?
ios - 如何使用 SwiftUI 观察 TextField 值并结合?
每次textField
更改 a 的值时,我都会尝试执行一个操作。
但我得到以下错误。
无法将“已发布”类型的值转换为预期的参数类型“绑定”
swift - 使用 Combine 时处理 Swift 5 排他性强制执行
Swift 5,“对内存的独占访问”强制现在默认为发布版本启用,如 Swift.org 博客文章中所述:
我理解这个特性背后的原因,但是有了新的Combine
框架,我觉得一些非常正常的设计模式现在会被打破,我很好奇如何最好地解决它们。
部分代码对Combine
模型中的更改做出反应是很自然的,因此它们可能需要从模型刚刚更改的属性中读取。但是他们不能再这样做了,因为它会在您尝试读取当前正在设置的值时触发内存异常。
考虑以下示例:
一旦changePassword()
被调用,互斥性强制执行将抛出异常,因为该属性password
将在当前被写入时尝试从中读取。
请注意,如果您将此示例更改为使用单独的后备存储属性而不是CurrentValueSubject
它,则会导致相同的异常。
但是,如果您PasswordProposal
从 a更改struct
为 a class
,则不再抛出异常。
当我考虑如何Combine
在现有代码库以及SwiftUI
. 在旧的委托模型中,委托从委托回调中查询发送对象是很常见的。在 Swift 5 中,我现在必须非常小心,这些回调没有一个可能从启动通知的属性中读取。
其他人是否遇到过这种情况,如果有,您是如何解决的?Apple 经常建议我们应该在structs
有意义的地方使用,但也许具有已发布属性的对象是它没有的那些领域之一?
ios - 在视图之外触发时如何绑定 SwiftUI.Alert 的呈现?
大多数显示示例是Alert
指某种@State
被用作控制警报视图的呈现/隐藏状态的绑定。
例如showingAlert
(来源):
当从 UI 层触发警报时,这是一个很好的解决方案 - 如示例所示:
但是如果我们想用特定的消息从控制器/视图模型层触发它呢?例如,我们进行网络调用 -URLSession
可以Publisher
发送Data
或Error
我们想要作为消息推送给用户的Alert
.
@State
被设计为从视图中管理body
,所以在这种情况下我们似乎应该使用 an @ObjectBinding
。看来我们也需要一些message
,所以可以在下面引用body
:
在这里showingAlert
会有点多余,因为我们可以定义message
为String?
并创建一个绑定presentation
:
这是一种可行的方法并且有效,但有两件事让我有点焦虑:
message
由两个抽象管理的事实- 警报的显示/隐藏状态的信息和管理泄漏到控制器/视图模型/对象绑定中。最好将呈现/隐藏状态私下保留在视图中。
- 事实上,消息一直保存在控制器/视图模型/对象绑定中,直到它被视图(绑定)“消耗”。
可以做得更好吗?
ios - 如何在swiftui中使用选择器内部的切换并根据切换更改选择器值
我需要使用选择器和切换,并且需要更改基于切换值的选择器值。
我已尝试实现它,但它在选择器内显示切换,但我无法根据切换更改选择器值。
这是我到目前为止所尝试的:
ios - Crash on Canvas SwiftUI
i'm implementing a little app with new iOS framework SwiftUI. I'm using @EnvironmentObject
to bind my data to view. All works, but the Canvas crash and not show nothing. Why?
The error message of the Canvas is this:
swift - Swift Combine:如何从发布者列表中创建单个发布者?
使用 Apple 的新组合框架,我想从列表中的每个元素发出多个请求。然后我想从减少所有响应中得到一个单一的结果。基本上,我想从发布者列表转到拥有响应列表的单个发布者。
我曾尝试制作出版商列表,但我不知道如何将该列表简化为单个出版商。而且我尝试制作一个包含列表的发布者,但我无法平面映射发布者列表。
请看“createIngredients”函数
我不确定如何获取一组发布者并将其转换为包含数组的发布者。
“[AnyPublisher]”类型的结果值不符合闭包结果类型“Publisher”
swift - 触发 CombineLatest 在 Combine 中传播初始值
我有两个字符串发布者和一个返回 AnyPublisher 的计算属性。逻辑很简单,但我想知道是否有任何方法可以传播初始值。我认为这应该是可能的,因为出版商有初始值。
在 VC 中,我从 ViewModel(来自 textField)为 Publishers 分配新值。
然后我将 Publisher (combineLatest) 分配给我的按钮:
在 VM 中,我有两个发布者:
和CombineLatest:
当我开始在两个文本字段中输入时,validatedText 才开始发布新值。例如,我尝试在 VM 的 init 中分配一些新值(给第一个和第二个 Publisher),但它也不起作用。有什么方法可以做到这一点,否则我将不得不在不使用组合的情况下设置按钮的初始状态(禁用它)?