这是一个简单的“下载”类来说明我想要做什么。
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)
| 归档时间: |
|
| 查看次数: |
9726 次 |
| 最近记录: |