Swift combine在iOS应用中无法正常运行



我对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()
}
}

突然,它不工作,日志不会打印。我肯定这是一些我不理解的愚蠢的东西但我一直在看这个。我的实际情况是一个没有运行的网络调用,所以我试着尽可能地简化,这是我能得到的最简单的。

感谢任何帮助!

谢谢!

这里有两件事:

  1. 您的cancellable立即超出范围,因此未被存储。在你的视图中将它改为@State属性。

  2. SwiftUI真的很挑剔什么可以/不可以在视图的init()中发生。有两种方法可以解决这个问题:a)移动到onAppearb)将其移动到@ObservableObject的init()

  3. 工作的例子:

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设置为视图的属性。

相关内容

最新更新