Я пытался использовать оболочку свойства SwiftUI @Environment
, но мне не удалось заставить ее работать так, как я ожидал. Пожалуйста, помогите мне понять, что я делаю неправильно.
В качестве примера у меня есть объект, который выдает целое число раз в секунду:
class IntGenerator: ObservableObject {
@Published var newValue = 0 {
didSet {
print(newValue)
}
}
private var toCanc: AnyCancellable?
init() {
toCanc = Timer.TimerPublisher(interval: 1, runLoop: .main, mode: .default)
.autoconnect()
.map { _ in Int.random(in: 0..<1000) }
.assign(to: \.newValue, on: self)
}
}
Этот объект работает, как и ожидалось, поскольку я вижу все целые числа, сгенерированные в журнале консоли. Теперь, допустим, мы хотим, чтобы этот объект был объектом среды, доступным для всех приложений и для кого угодно. Давайте создадим связанный ключ среды:
struct IntGeneratorKey: EnvironmentKey {
static let defaultValue = IntGenerator()
}
extension EnvironmentValues {
var intGenerator: IntGenerator {
get {
return self[IntGeneratorKey.self]
}
set {
self[IntGeneratorKey.self] = newValue
}
}
}
Теперь я могу получить доступ к этому объекту следующим образом (например, из вида):
struct TestView: View {
@Environment(\.intGenerator) var intGenerator: IntGenerator
var body: some View {
Text("\(intGenerator.newValue)")
}
}
К сожалению, несмотря на то, что newValue
является Свойство @Published
Я не получаю никаких обновлений по этому свойству, а Text
всегда показывает 0. Я уверен, что я что-то здесь упустил, что происходит? Спасибо.