0

我想用处理新发布的值时收到的值更新一些变量。例如,给定:

class ProductViewModel: ObservableObject {
    @Published var PublishedX: Int = 0
    @Published var PublishedY: Int = 0
    @Published var PublishedProduct: Int = 0
    // ...
    init() {
        productPublisher = Publishers.CombineLatest(external.XPublisher, internal.YPublisher)
            // .assignAndContinue(\.PublishedX, \.PublishedY) // something like this
            .flatMap(MyPublishers.secretMultiplication)
            .assign(to: \.PublishedProduct, on: self)
     }
 }

我还想将 XPublisher 和 YPublisher 的新值分配给变量(分别为 PublishedX 和 PublishedY)。

有没有办法设置这两个变量然后继续处理事件?

4

2 回答 2

2

更新

如果您的部署目标是 2020 系统(如 iOS 14+ 或 macOS 11+),您可以使用不同版本的assign运算符来避免保留周期并避免存储可取消项:

init() {
    external.XPublisher.assign(to: $PublishedX)
    external.YPublisher.assign(to: $PublishedY)
    external.XPublisher
        .combineLatest(external.YPublisher) { $0 * $1 }
        .assign(to: $PublishedProduct)
}

原来的

没有内置变体assign(to:on:)返回 anotherPublisher而不是 a Cancellable

只需使用多个assigns:

class ProductViewModel: ObservableObject {
    @Published var PublishedX: Int = 0
    @Published var PublishedY: Int = 0
    @Published var PublishedProduct: Int = 0

    init() {
        external.XPublisher
            .assign(to: \.PublishedX, on: self)
            .store(in: &tickets)
        internal.YPublisher
            .assign(to: \.PublishedY, on: self)
            .store(in: &tickets)
        external.XPublisher
            .combineLatest(internal.YPublisher) { $0 * $1 }
            .assign(to: \.PublishedProduct, on: self)
            .store(in: &tickets)
    }

    private var tickets: [AnyCancellable] = []
}

请注意,这些订阅会创建保留周期。在数组被清除ProductViewModel之前,Swift 将无法销毁 的实例。tickets(这不是我建议的属性。您的原始代码还需要将其订阅存储在某处,否则将立即取消。)

此外,存在PublishedProduct是值得怀疑的。为什么不只是一个计算属性?

var product: Int { PublishedX * PublishedY }
于 2020-03-30T20:22:02.070 回答
1

你可能想看看这个图书馆

从他们的自述文件中

var label1: UILabel
var label2: UILabel
var text: UITextField

["hey", "there", "friend"]
    .publisher
    .assign(to: \.text, on: label1,
            and: \.text, on: label2,
            and: \.text, on: text)
于 2020-12-07T22:16:59.617 回答