【发布时间】:2021-01-06 12:14:21
【问题描述】:
我在使用 SwiftUI 时遇到了这个非常奇怪的问题/错误。在setupSubscription 方法中,我正在创建对subject 的订阅并将其插入到cancellables 集合中。然而,当我打印cancellables 的计数时,我得到了零。如果我只是在其中插入一个元素,集合怎么可能是空的?
这大概就是为什么当我点击按钮时没有调用handleValue 方法的原因。这是控制台的完整输出:
init
begin setupSubscription
setupSubscription subject sink: receive subscription: (CurrentValueSubject)
setupSubscription subject sink: request unlimited
setupSubscription subject sink: receive value: (initial value)
handleValue: 'initial value'
setupSubscription: cancellables.count: 0
setupSubscription subject sink: receive cancel
sent value: 'value 38'
cancellables.count: 0
sent value: 'value 73'
cancellables.count: 0
sent value: 'value 30'
cancellables.count: 0
我做错了什么?为什么我对subject 的订阅被取消了?为什么我点击按钮时没有调用handleValue?
import SwiftUI
import Combine
struct Test: View {
@State private var cancellables: Set<AnyCancellable> = []
let subject = CurrentValueSubject<String, Never>("initial value")
init() {
print("init")
self.setupSubscription()
}
var body: some View {
VStack {
Button(action: {
let newValue = "value \(Int.random(in: 0...100))"
self.subject.send(newValue)
print("sent value: '\(newValue)'")
print("cancellables.count:", cancellables.count)
}, label: {
Text("Tap Me")
})
}
}
func setupSubscription() {
print("begin setupSubscription")
let cancellable = self.subject
.print("setupSubscription subject sink")
.sink(receiveValue: handleValue(_:))
self.cancellables.insert(cancellable)
print("setupSubscription: cancellables.count:", cancellables.count)
// prints "setupSubscription: cancellables.count: 0"
}
func handleValue(_ value: String) {
print("handleValue: '\(value)'")
}
}
【问题讨论】: