我在SwiftUI中遇到了一个非常奇怪的问题/bug。在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)'")
}
}