Swift 未使用正确的值观察到已发布的var
我有一个Swift 未使用正确的值观察到已发布的var,swift,Swift,我有一个已发布的变量,可以在类中设置该变量,但在调用它的视图中不会读取该值 下面是课程: class Api: ObservableObject { @Published var showingAlert = false func getRunClub(url: String, completion : @escaping ([RunClubsv2])->()){ let session = URLSession(configuration: .defa
已发布的
变量,可以在类中设置该变量,但在调用它的视图中不会读取该值
下面是课程:
class Api: ObservableObject {
@Published var showingAlert = false
func getRunClub(url: String, completion : @escaping ([RunClubsv2])->()){
let session = URLSession(configuration: .default)
session.dataTask(with: URL(string: url)!) { (data, response, err) in
if err != nil{
print("Unable to get data \(err!.localizedDescription)")
return
}
//decoding JSON
do {
self.showingAlert = true. <== Here's where I set it
print("Class API set alert to: \(self.showingAlert)") <== I can see it being set to true here
let runclubs = try JSONDecoder().decode([RunClubsv2].self, from: data!)
// print(runclubs)
//returning data
completion(runclubs)
}
catch{
print("Catching error \(error)")
}
}
.resume()
}
我真的不确定我做错了什么。每次你说
Api()
,那是一个不同的Api对象。因此,当您说Api().getRunClub
时,您正在调用的getRunClub
的Api与您正在完成处理程序中检查的Apiself.foo
不同。这就好像你把一只狗涂成红色,然后转过身去,想知道为什么另一只狗不是红色的
还有,你说
print("Alert was set to: \(self.foo.showingAlert)")
if self.foo.showingAlert == true {
一切都错了。这个值不会改变。拥有一个可观察的物体的意义在于你观察它。你不是在观察它,你只是看了它一眼。所以当然,它永远不会改变
看起来您可能要做的是执行一些耗时的操作(如联网),在操作期间发出警报,然后在操作结束时再次降低警报。在这种情况下,你的结构是完全错误的。您需要使用与ObserveObject的@Published
值的绑定来触发警报的存在或不存在。以下是所需结构的草图示例:
class-AlertShower:observateObject{
@已发布的var showAlert=false
func doYourThing(){
self.showart=true
//假设这是一个耗时的操作
DispatchQueue.main.asyncAfter(截止日期:.now()+2){
self.showart=false
}
}
}
结构ContentView:View{
@ObservedObject变量alertShower=alertShower()
var body:一些观点{
按钮(“点击我”){
self.alertShower.doYourThing()
}.fullScreenCover(显示:self.$alertShower.showAlert,内容:{
文本(“我是警报”)
})
}
}
如果您只是运行该代码,您将看到当您点击按钮时,“警报”会出现一段时间,然后消失。这似乎就是你所追求的那种东西(尽管很难说)。每次你说
Api()
,那是一个不同的Api对象。因此,当您说Api().getRunClub
时,您正在调用的getRunClub
的Api与您正在完成处理程序中检查的Apiself.foo
不同。这就好像你把一只狗涂成红色,然后转过身去,想知道为什么另一只狗不是红色的
还有,你说
print("Alert was set to: \(self.foo.showingAlert)")
if self.foo.showingAlert == true {
一切都错了。这个值不会改变。拥有一个可观察的物体的意义在于你观察它。你不是在观察它,你只是看了它一眼。所以当然,它永远不会改变
看起来您可能要做的是执行一些耗时的操作(如联网),在操作期间发出警报,然后在操作结束时再次降低警报。在这种情况下,你的结构是完全错误的。您需要使用与ObserveObject的@Published
值的绑定来触发警报的存在或不存在。以下是所需结构的草图示例:
class-AlertShower:observateObject{
@已发布的var showAlert=false
func doYourThing(){
self.showart=true
//假设这是一个耗时的操作
DispatchQueue.main.asyncAfter(截止日期:.now()+2){
self.showart=false
}
}
}
结构ContentView:View{
@ObservedObject变量alertShower=alertShower()
var body:一些观点{
按钮(“点击我”){
self.alertShower.doYourThing()
}.fullScreenCover(显示:self.$alertShower.showAlert,内容:{
文本(“我是警报”)
})
}
}
如果您只是运行该代码,您将看到当您点击按钮时,“警报”会出现一段时间,然后消失。这似乎是你所追求的那种东西(尽管很难说)。这更有意义。为什么当我删除
self
时会出现以下错误-在闭包中引用属性“foo”需要显式的“self”。以使捕获语义显式。是因为我在列表中吗
?我尝试调用Api()。showingAlert
查看我会有一个不同的值,但它仍然设置为false
是的,这是另一个Api对象。太好了,现在你有三条狗,其中两只不是红色的。眼卷。请重读我的第一句话:每次你说Api()
,那是一个不同的Api对象。千方百计。至于另一个错误,那完全是另一回事;把它吸起来,说“我自己”。我不要三条狗,我只要一条狗。我没听懂你说的话。我不介意吸吮它并使用self.
,但是self.foo
刚刚返回了上面设置的Api
。你能告诉我需要做什么才能得到发布的var的值吗?“但是,self.foo
刚刚返回了上面设置的Api”,这不正是你想要的吗?你想一直和self.foo。那是你唯一的狗不过,老实说,如果您要主动获取self.foo.showingAlert
的值,那么我看不出发布@或将其作为可观察对象有什么意义。您甚至没有解释showingAlert的作用。如果它应该做一个警报显示,那么在If
语句中查看self.foo.showinglert
并不是你应该做的。这更有意义。为什么当我删除self
时会出现以下错误-在闭包中引用属性“foo”需要显式的“self”。以使捕获语义显式。是