【发布时间】:2019-10-26 16:29:38
【问题描述】:
我正试图围绕 SwiftUI 和 Combine。我想用一个值使 UI 中的一些文本保持最新。例如,在这种情况下,它是设备的电池电量。
这是我的代码。首先,这似乎是实现我想要做的事情的相当多的代码,所以我想知道我是否可以不使用它。另外,这段代码曾经在夏天运行,但现在它崩溃了,可能是由于 SwiftUI 和 Combine 的变化。
如何解决此问题以与当前版本的 SwiftUI 和 Combine 一起使用?而且,是否可以减少这里的代码量来做同样的事情?
import SwiftUI
import Combine
class ViewModel: ObservableObject {
var willChange = PassthroughSubject<Void, Never>()
var batteryLevelPublisher = UIDevice.current
.publisher(for: \.batteryLevel)
.receive(on: RunLoop.main)
lazy var batteryLevelSubscriber = Subscribers.Assign(object: self,
keyPath: \.batteryLevel)
var batteryLevel: Float = UIDevice.current.batteryLevel {
didSet {
willChange.send()
}
}
init() {
batteryLevelPublisher.subscribe(batteryLevelSubscriber)
}
}
struct ContentView: View {
@ObservedObject var viewModel = ViewModel()
var body: some View {
Text("\(Int(round(viewModel.batteryLevel * 100)))%")
}
}
【问题讨论】: