gpt4 book ai didi

ios - Swift 组合运算符与 RxSwift 框架中的 `withLatestFrom` 等功能相同

转载 作者:行者123 更新时间:2023-12-03 21:13:41 27 4
gpt4 key购买 nike

我正在开发一个采用 MVVM 模式的 iOS 应用程序,使用 SwiftUI 设计 View 和 Swift 组合,以便将我的 View 与其各自的 View 模型粘合在一起。
在我的一个 ViewModel 中,我创建了一个 Publisher(类型 Void )用于按下按钮,另一个用于 TextField(类型 String )的内容。
我希望能够在我的 ViewModel 中组合两个发布者,这样组合的发布者仅在按钮发布者发出事件时才发出事件,同时从字符串发布者获取最新事件,因此我可以对 TextField 进行某种评估数据,每次用户按下按钮。所以我的虚拟机看起来像这样:

import Combine
import Foundation

public class MyViewModel: ObservableObject {
@Published var textFieldContent: String? = nil
@Published var buttonPressed: ()

init() {
// Combine `$textFieldContent` and `$buttonPressed` for evaulation of textFieldContent upon every button press...
}
}

两个发布者都通过 SwiftUI 获取数据,所以我将省略那部分,让我们假设两个发布者都随着时间的推移收到一些数据。

来自 RxSwift 框架,我的 goto 解决方案将是 withLatestFrom 运算符来组合两个可观察对象。
然而,在“组合来自多个发布者的元素”一节中深入研究 Publisher 的 Apple 文档,我找不到类似的东西,所以我希望目前缺少这种运算符。

所以我的问题是:是否可以使用结合框架的现有 operator-API 最终获得与 withLatestFrom 相同的行为?

最佳答案

有一个内置的运算符听起来很棒,但是您可以从现有的运算符中构建相同的行为,如果这是您经常做的事情,那么很容易从现有的运算符中创建自定义运算符。
在这种情况下的想法是使用 combineLatest以及诸如 removeDuplicates 之类的运算符除非按钮发出了新值,否则它会阻止值沿管道传递。例如(这只是在操场上的一个测试):

var storage = Set<AnyCancellable>()
var button = PassthroughSubject<Void, Never>()
func pressTheButton() { button.send() }
var text = PassthroughSubject<String, Never>()
var textValue = ""
let letters = (97...122).map({String(UnicodeScalar($0))})
func typeSomeText() { textValue += letters.randomElement()!; text.send(textValue)}

button.map {_ in Date()}.combineLatest(text)
.removeDuplicates {
$0.0 == $1.0
}
.map {$0.1}
.sink { print($0)}.store(in:&storage)

typeSomeText()
typeSomeText()
typeSomeText()
pressTheButton()
typeSomeText()
typeSomeText()
pressTheButton()
输出是两个随机字符串,例如 "zed""zedaf" .关键是每次我们调用 typeSomeText 时,都会将文本发送到管道中。 ,但除非我们调用 pressTheButton,否则我们不会在管道末尾收到文本。 .
这似乎是你所追求的那种事情。

你会注意到我完全忽略了按钮发送的值是什么。 (在我的示例中,无论如何它只是一个空值。)如果该值很重要,则更改初始映射以将该值作为元组的一部分包含在内,然后删除元组的 Date 部分:
button.map {value in (value:value, date:Date())}.combineLatest(text)
.removeDuplicates {
$0.0.date == $1.0.date
}
.map {($0.value, $1)}
.map {$0.1}
.sink { print($0)}.store(in:&storage)
这里的重点是在 .map {($0.value, $1)} 行之后到达的内容。就像什么 withLatestFrom将产生:两个出版商的最新值的元组。

关于ios - Swift 组合运算符与 RxSwift 框架中的 `withLatestFrom` 等功能相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61959647/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com