has*_*o11 9 notificationcenter swiftui combine
我想在应用程序进入后台并返回时收听通知。我正在尝试使用 NotificationCenter 发布者并让 SwiftUI 视图收听它们。
我可以使用几种方法来做到这一点,我正在尝试使用其中的两种方法,但有趣的是,尽管当我将订阅者放入init()方法中时,所有方法看起来都是合法的,但它不起作用。
我试图把它放在main线程上,但仍然没有成功。
有谁知道为什么?
这是我的代码:
struct ContentView: View {
@State var isActive = true
@State var cancellables = Set<AnyCancellable>()
var body: some View {
ZStack {
Image("background")
.resizable()
.scaledToFill()
.edgesIgnoringSafeArea(.all)
}
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)) { _ in
self.isActive = false
}
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification), perform: {_ in
self.isActive = true
})
}
init() {
NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)
// .receive(on: RunLoop.main)
.sink(receiveValue: { _ in
print("init")
}
.store(in: &cancellables)
}
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,onReceive修饰符中的侦听器就像一个魅力。在init()该print("init")不会被调用。
@Stateinit 中尚未准备好,因此不能用于此类目的。方法如下:
var cancellables = Set<AnyCancellable>()
init() {
NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)
.sink(receiveValue: { _ in
print(">> in init")
})
.store(in: &cancellables)
}
Run Code Online (Sandbox Code Playgroud)
在这样的定义中,cancellables您可以存储在 中创建的所有订阅者init,但稍后您将无法在代码中使用它,但是这种方法对于曾经定义过的通知处理程序很有用。
| 归档时间: |
|
| 查看次数: |
4745 次 |
| 最近记录: |