我对swift很陌生,所以我可能会理解错。
我正在学习使用联合收割机,所以我使用操场以这样的间隔记录日志
var cancellable:AnyCancellable? = Timer.publish(every: 1, on: .main, in: .default)
.autoconnect()
.sink {
print($0)
}
PlaygroundPage.current.needsIndefiniteExecution = true
它非常简单,它的工作方式就像我期望的那样,每秒打印一个日志。
现在,当我在Xcode中创建一个新的iOS项目时,它似乎不起作用,我不知道为什么。在一个空白项目中,我只是在ContentView
中添加了这个struct ContentView: View {
func test() {
var cancellable: AnyCancellable?
cancellable = Timer.publish(every: 1, on: .main, in: .default)
.autoconnect()
.sink {
print($0)
}
}
var body: some View {
VStack {
Text("Hello, world!")
.padding()
}
}
init() {
test()
}
}
突然,它不工作,日志不会打印。我肯定这是一些我不理解的愚蠢的东西但我一直在看这个。我的实际情况是一个没有运行的网络调用,所以我试着尽可能地简化,这是我能得到的最简单的。
感谢任何帮助!
谢谢!
这里有两件事:
-
您的
cancellable
立即超出范围,因此未被存储。在你的视图中将它改为@State属性。 -
SwiftUI真的很挑剔什么可以/不可以在视图的
init()
中发生。有两种方法可以解决这个问题:a)移动到onAppear
b)将其移动到@ObservableObject
的init() 工作的例子:
struct ContentView: View {
@State var cancellable : AnyCancellable?
func test() {
cancellable = Timer.publish(every: 1, on: .main, in: .default)
.autoconnect()
.sink {
print($0)
}
}
var body: some View {
VStack {
Text("Hello, world!")
.padding()
}.onAppear {
test()
}
}
}
ObservableObject版本:
class ViewModel : ObservableObject {
private var cancellable : AnyCancellable?
init() {
cancellable = Timer.publish(every: 1, on: .main, in: .default)
.autoconnect()
.sink {
print($0)
}
}
}
struct ContentView: View {
var vm = ViewModel()
var body: some View {
VStack {
Text("Hello, world!")
.padding()
}
}
}
您没有调用该函数。在这种情况下,您需要将cancellable设置为视图的属性。