Swiftui 无法显示来自可观察对象的警报
场景: 我希望能够通过@Published values(networkMessage&hasAlert)显示来自可观察对象的警报()。 丢失网络连接时应触发此警报Swiftui 无法显示来自可观察对象的警报,swiftui,alert,combine,Swiftui,Alert,Combine,场景: 我希望能够通过@Published values(networkMessage&hasAlert)显示来自可观察对象的警报()。 丢失网络连接时应触发此警报 通过 显示警报()的主机视图: 可观察对象最初通过case.failure触发警报() 问题:为什么我没有通过 standardWeatherReport.hasAlert不是来自类PublishedWeatherReport。 StandardWeatherReportclass在哪里?我有两个出版商混在一起。 因此,相
通过 显示警报()的主机视图: 可观察对象最初通过case.failure触发警报() 问题:为什么我没有通过
standardWeatherReport.hasAlert
不是来自类PublishedWeatherReport
。
StandardWeatherReport
class在哪里?我有两个出版商混在一起。因此,相关警报无法正常运行 我还有多个警报操作符,每个发布者一个。
这是一个糟糕的设计:每个主机只允许一(1)个警报操作员;否则,第二个.alert运算符将覆盖前一个运算符
因此,如果一个警报处于活动状态,下面的非活动警报操作员将立即取消它。我有多个发布者。上面的代码显示了标准和已发布的天气报告:我把它们混在一起了(打字错误);谢谢你的观察。
import SwiftUI
struct EndPointView: View {
@EnvironmentObject var settings: Settings
@ObservedObject var standardWeatherReport = StandardWeatherReport()
@ObservedObject var publishedWeatherReport = PublishedWeatherReport()
@ObservedObject var pepBoy = PepBoy()
@ObservedObject var postMan = PostMan()
var body: some View {
Form {
Text("Chosen One: \(settings.endpointSection)")
Text("Row Two")
Text("Row Three")
Text("Row Four")
}.onAppear {
self.acquireData()
}
.alert(isPresented: $standardWeatherReport.hasAlert, content: { () -> Alert in
Alert(title: Text(verbatim: standardWeatherReport.networkMessage!))
})
}
func acquireData() {
let chosenEndPoint = EndPoints(rawValue: settings.endpointSection)
switch chosenEndPoint {
case .standardWeather:
standardWeatherReport.doStandard()
case .publishedWeather:
publishedWeatherReport.doPublish()
case .postman:
postMan.doPublishPostMan()
case .publishpepboy:
pepBoy.doPublishPep()
case .none:
print("none")
}
}
}
import Foundation
class PublishedWeatherReport: ObservableObject {
@Published var networkMessage: String?
@Published var hasAlert = false
@Published var weatherReport: String?
func doPublish() {
let url = EndPoint.weather.path()
var request = URLRequest(url: EndPoint.weather.path()!)
request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
// Publisher:
let remoteDataPublisher = URLSession.shared.dataTaskPublisher(for: url!)
// the dataTaskPublisher output combination is (data: Data, response: URLResponse)
.map { $0.data }
.decode(type: Sample.self, decoder: decoder)
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
// Subscriber:
sub = remoteDataPublisher // ...must assign to an iVar to keep alive.
.sink(receiveCompletion: { completion in
switch completion {
case .finished:
break
case .failure(let anError):
self.networkMessage = anError.localizedDescription
self.hasAlert = true. // ... unable to host Alert().
}
}, receiveValue: { someValue in
print(".sink() received \(someValue)")
})
}
}
(isPresented: $standardWeatherReport.hasAlert)?