swift - 有没有办法在 Swift Joint 中多次调用 allocate() ?

标签 swift combine observableobject

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

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)。

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

最佳答案

更新

如果您的部署目标是 2020 系统(例如 iOS 14+ 或 macOS 11+),您可以使用 a different version of the assign operator避免循环引用并避免存储可取消项:

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

原版

assign(to:on:) 没有内置变体返回另一个 Publisher而不是Cancellable .

只需使用多个 assign s:

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] = []
}

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

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

var product: Int { PublishedX * PublishedY }

关于swift - 有没有办法在 Swift Joint 中多次调用 allocate() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60934884/

相关文章:

ios - 覆盖不同类型的变量属性

ios - 核心数据 - 编辑、增加和保存属性到已经存在的实体

ios - 在 View 外部触发时如何绑定(bind) SwiftUI.Alert 的呈现?

ios - SwiftUI:执行函数时如何从观察到的对象中捕获变化的值

ios - 通过另一个 ObObject 传递 ObservableObject 模型?

swiftui - UIViewRepresentable 无法在模态呈现的 SwiftUI View 中工作

ios - SKVideoNode 仅在节点或相机移动时在 SCNScene 中渲染

ios - 当我在 UIScrollView (Swift 3) 中滚动图像时,背景颜色渐变效果

swift - 是否可以在 SwiftUI 中提供服务并将数据推送到 View 并更新 UI?

SwiftUI ObservableObject 在发布值时不会更新