合并分配(to: on:)另一个发布者

Jon*_*gel 7 ios swift combine

这是一个简单的“下载”类来说明我想要做什么。

class Download {
    
    public var progress: CurrentValueSubject<Double, Never> = CurrentValueSubject<Double, Never>(0)
    
    var subscriptions: Set<AnyCancellable> = []
    
    func start(task: URLSessionTask) {
        task.resume()
        task.progress.publisher(for: \.fractionCompleted).sink { [weak self] (newProgress) in
            self?.progress.send(newProgress)
        }.store(in: &subscriptions)
    }
    
}
Run Code Online (Sandbox Code Playgroud)

我希望能够将进度属性观察者发布者“重新发布”到我当前的值主题。如您所见,我当前使用该.sink函数进行订阅,然后CurrentValueSubject直接调用发布者。

我希望能够使用类似.assign(to:, on:)这样的运算符。

task.progress.publisher(for: \.fractionCompleted).assign(to: \.progress, on: self)
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用,.assign(to:)似乎保留用于在 SwiftUI@Published属性上“重新发布”的操作符也不起作用。为什么Combine在这里名不副实?

rob*_*off 13

因为CurrentValueSubject是 a class,所以可以将其用作object的参数assign(to:on:)。这样就不会出现内存泄漏:

class Download {
    
    public let progress: CurrentValueSubject<Double, Never> = .init(0)
    
    var subscriptions: [AnyCancellable] = []
    
    func start(task: URLSessionTask) {
        task.resume()
        task.progress
            .publisher(for: \.fractionCompleted)
            .assign(to: \.value, on: progress)
            .store(in: &subscriptions)
    }
    
}
Run Code Online (Sandbox Code Playgroud)