问题标签 [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.

0 投票
5 回答
7720 浏览

swift - RunLoop 与 DispatchQueue 作为调度程序

使用新的组合框架时,您可以指定从发布者接收元素的调度程序。

在将发布者分配给 UI 元素时,RunLoop.main和在这种情况下是否有很大区别?DispatchQueue.main第一个返回主线程的运行循环和与主线程关联的第二个队列。

0 投票
2 回答
1659 浏览

swift - 多个 UITextFields 和 textDidChangeNotification 通知

我最近在玩 Combine 框架,想知道是否可以创建一些智能扩展来作为 Publisher 获取文本更改。

假设我有两个 UITextField:

其中第一个和第二个变量只是`@Published var first/second: String = ""

这不起作用,因为我使用的是 NotificationCenter 的共享实例,因此当我对任何 textFields 进行任何更改时,它会将新值传播到两个sink闭包。你认为有什么方法可以实现类似于rx.textRxSwift 中可用的东西吗?我正在考虑使用addTargetwith 闭包,但它需要使用来自 Objective-C 的关联对象。

0 投票
1 回答
242 浏览

swift - “PassthroughSubject”似乎是线程不安全的,这是错误还是限制?

“PassthroughSubject”似乎是线程不安全的。请参阅下面的代码,我同时向仅请求的订阅者发送 100 个值.max(5)。我认为订阅者应该只得到 5 个值,但实际上它得到了更多。这是错误还是限制?

0 投票
4 回答
10426 浏览

ios - 如何使用 SwiftUI 观察 TextField 值并结合?

每次textField更改 a 的值时,我都会尝试执行一个操作。

但我得到以下错误。

无法将“已发布”类型的值转换为预期的参数类型“绑定”

0 投票
1 回答
249 浏览

swift - 使用 Combine 时处理 Swift 5 排他性强制执行

Swift 5,“对内存的独占访问”强制现在默认为发布版本启用,如 Swift.org 博客文章中所述:

Swift 5 排他性执法

我理解这个特性背后的原因,但是有了新的Combine框架,我觉得一些非常正常的设计模式现在会被打破,我很好奇如何最好地解决它们。

部分代码对Combine模型中的更改做出反应是很自然的,因此它们可能需要从模型刚刚更改的属性中读取。但是他们不能再这样做了,因为它会在您尝试读取当前正在设置的值时触发内存异常。

考虑以下示例:

一旦changePassword()被调用,互斥性强制执行将抛出异常,因为该属性password将在当前被写入时尝试从中读取。

请注意,如果您将此示例更改为使用单独的后备存储属性而不是CurrentValueSubject它,则会导致相同的异常。

但是,如果您PasswordProposal从 a更改struct为 a class,则不再抛出异常。

当我考虑如何Combine在现有代码库以及SwiftUI. 在旧的委托模型中,委托从委托回调中查询发送对象是很常见的。在 Swift 5 中,我现在必须非常小心,这些回调没有一个可能从启动通知的属性中读取。

其他人是否遇到过这种情况,如果有,您是如何解决的?Apple 经常建议我们应该在structs有意义的地方使用,但也许具有已发布属性的对象是它没有的那些领域之一?

0 投票
1 回答
1478 浏览

ios - 在视图之外触发时如何绑定 SwiftUI.Alert 的呈现?

大多数显示示例是Alert指某种@State被用作控制警报视图的呈现/隐藏状态的绑定。

例如showingAlert来源):

当从 UI 层触发警报时,这是一个很好的解决方案 - 如示例所示:

但是如果我们想用特定的消息从控制器/视图模型层触发它呢?例如,我们进行网络调用 -URLSession可以Publisher发送DataError我们想要作为消息推送给用户的Alert.

@State被设计为从视图中管理body,所以在这种情况下我们似乎应该使用 an @ObjectBinding。看来我们也需要一些message,所以可以在下面引用body

在这里showingAlert会有点多余,因为我们可以定义messageString?并创建一个绑定presentation

这是一种可行的方法并且有效,但有两件事让我有点焦虑:

  1. message由两个抽象管理的事实
  2. 警报的显示/隐藏状态的信息和管理泄漏到控制器/视图模型/对象绑定中。最好将呈现/隐藏状态私下保留在视图中。
  3. 事实上,消息一直保存在控制器/视图模型/对象绑定中,直到它被视图(绑定)“消耗”。

可以做得更好吗?

0 投票
1 回答
854 浏览

ios - 如何在swiftui中使用选择器内部的切换并根据切换更改选择器值

我需要使用选择器和切换,并且需要更改基于切换值的选择器值。

我已尝试实现它,但它在选择器内显示切换,但我无法根据切换更改选择器值。

这是我到目前为止所尝试的:

0 投票
1 回答
3901 浏览

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:

0 投票
4 回答
27299 浏览

swift - Swift Combine:如何从发布者列表中创建单个发布者?

使用 Apple 的新组合框架,我想从列表中的每个元素发出多个请求。然后我想从减少所有响应中得到一个单一的结果。基本上,我想从发布者列表转到拥有响应列表的单个发布者。

我曾尝试制作出版商列表,但我不知道如何将该列表简化为单个出版商。而且我尝试制作一个包含列表的发布者,但我无法平面映射发布者列表。

请看“createIngredients”函数

我不确定如何获取一组发布者并将其转换为包含数组的发布者。

“[AnyPublisher]”类型的结果值不符合闭包结果类型“Publisher”

0 投票
1 回答
1638 浏览

swift - 触发 CombineLatest 在 Combine 中传播初始值

我有两个字符串发布者和一个返回 AnyPublisher 的计算属性。逻辑很简单,但我想知道是否有任何方法可以传播初始值。我认为这应该是可能的,因为出版商有初始值。

在 VC 中,我从 ViewModel(来自 textField)为 Publishers 分配新值。

然后我将 Publisher (combineLatest) 分配给我的按钮:

在 VM 中,我有两个发布者:

和CombineLatest:

当我开始在两个文本字段中输入时,validatedText 才开始发布新值。例如,我尝试在 VM 的 init 中分配一些新值(给第一个和第二个 Publisher),但它也不起作用。有什么方法可以做到这一点,否则我将不得不在不使用组合的情况下设置按钮的初始状态(禁用它)?