ObservedObject 只传递它的默认值;不是它的赋值。为什么?
ObservedObject only passes its default value; not its assigned value. Why?
场景: 尝试通过 ObservableObject 广播变量值。
问题:我只得到默认值;不是 分配的 值。
这是起源。
按钮 #1 启动一个函数来获取数据。
按钮 #2 检索 ObservedObject 的修改值
我删除了一些残留代码以使演示更简单:
struct ContentView: View {
@ObservedObject var networkManager = NetworkManager()
let fontCustom = Font.custom("Noteworthy", size: 23.0)
var body: some View {
ZStack {
// ...
// ...
HStack {
Button(
action: {
NetworkManager().getCalculatorIDs()
},
label: {
Text("1")
}
)
Button(
action: {
self.calculator.calculate("2");
print(self.networkManager.calculationID) // stop and check.
},
label: { Text("2") }
)
// ...
// ...
}
}
所以我点击按钮 #1,然后点击按钮 #2 以检查 ObservedObject 是否具有 生成的 ID 值 。
我期待 print() 中的字母数字 id 值。
相反,我得到了原始值:
Royal Turkey
(lldb)
这是 ObservableObject:
struct CalculationIdentifier: Decodable {
let id: String
let tokens: [String]
}
class NetworkManager: ObservableObject {
@Published var calculationID = "Royal Turkey"
@Published var isAlert = false
@Published var name = "Ric Lee"
let calculations = "https://calculator-frontend-challenge.herokuapp.com/Calculations"
func getCalculatorIDs() {
let urlRequest = URLRequest(url: URL(string: calculations)!)
let configuration = URLSessionConfiguration.ephemeral
let task = URLSession(configuration: configuration).dataTask(with: urlRequest) { data, _, error in
DispatchQueue.main.async {
do {
let result = try JSONDecoder().decode([CalculationIdentifier].self, from: data!)
if !result.isEmpty {
self.calculationID = (result[0] as CalculationIdentifier).id
print("Inside do{}. result = \(result)")
self.isAlert = true
} else {
print(#function, "Line:", #line, ": No Result")
}
} catch {
print(error)
}
}
}
task.resume()
}
}
顺便说一句:这是 local 控制台输出,'id' 的字符串值应该作为 ObservedObject 值传递给主机:
Inside do{}. result = [RicCalculator2.CalculationIdentifier(id: "d3dd3b1e-d9f6-4593-8c85-b8fd3d018383", tokens: [])]
所以我确实有一个真正的 id 值要发送。
为什么只有原始值?
我错过了什么?
...我需要做一个 'send' 什么的吗?
这个
A. @ObservedObject var networkManager = NetworkManager()
还有这个
B. NetworkManager().getCalculatorIDs()
在您的代码中有不同的对象,即。你创建一个对象作为成员,然后在堆栈上创建另一个对象,它做了一些事情,然后要求第一个对象 return 一些东西 - 自然如果 return 它在初始化时有什么。
可能你假设情况 B
self.networkManager.getCalculatorIDs()
场景: 尝试通过 ObservableObject 广播变量值。
问题:我只得到默认值;不是 分配的 值。
这是起源。
按钮 #1 启动一个函数来获取数据。
按钮 #2 检索 ObservedObject 的修改值
我删除了一些残留代码以使演示更简单:
struct ContentView: View {
@ObservedObject var networkManager = NetworkManager()
let fontCustom = Font.custom("Noteworthy", size: 23.0)
var body: some View {
ZStack {
// ...
// ...
HStack {
Button(
action: {
NetworkManager().getCalculatorIDs()
},
label: {
Text("1")
}
)
Button(
action: {
self.calculator.calculate("2");
print(self.networkManager.calculationID) // stop and check.
},
label: { Text("2") }
)
// ...
// ...
}
}
所以我点击按钮 #1,然后点击按钮 #2 以检查 ObservedObject 是否具有 生成的 ID 值 。
我期待 print() 中的字母数字 id 值。
相反,我得到了原始值:
Royal Turkey
(lldb)
这是 ObservableObject:
struct CalculationIdentifier: Decodable {
let id: String
let tokens: [String]
}
class NetworkManager: ObservableObject {
@Published var calculationID = "Royal Turkey"
@Published var isAlert = false
@Published var name = "Ric Lee"
let calculations = "https://calculator-frontend-challenge.herokuapp.com/Calculations"
func getCalculatorIDs() {
let urlRequest = URLRequest(url: URL(string: calculations)!)
let configuration = URLSessionConfiguration.ephemeral
let task = URLSession(configuration: configuration).dataTask(with: urlRequest) { data, _, error in
DispatchQueue.main.async {
do {
let result = try JSONDecoder().decode([CalculationIdentifier].self, from: data!)
if !result.isEmpty {
self.calculationID = (result[0] as CalculationIdentifier).id
print("Inside do{}. result = \(result)")
self.isAlert = true
} else {
print(#function, "Line:", #line, ": No Result")
}
} catch {
print(error)
}
}
}
task.resume()
}
}
顺便说一句:这是 local 控制台输出,'id' 的字符串值应该作为 ObservedObject 值传递给主机:
Inside do{}. result = [RicCalculator2.CalculationIdentifier(id: "d3dd3b1e-d9f6-4593-8c85-b8fd3d018383", tokens: [])]
所以我确实有一个真正的 id 值要发送。
为什么只有原始值?
我错过了什么?
...我需要做一个 'send' 什么的吗?
这个
A. @ObservedObject var networkManager = NetworkManager()
还有这个
B. NetworkManager().getCalculatorIDs()
在您的代码中有不同的对象,即。你创建一个对象作为成员,然后在堆栈上创建另一个对象,它做了一些事情,然后要求第一个对象 return 一些东西 - 自然如果 return 它在初始化时有什么。
可能你假设情况 B
self.networkManager.getCalculatorIDs()