【问题标题】:ObservedObject only passes its default value; not its assigned value. Why?ObservedObject 只传递其默认值;不是它的赋值。为什么?
【发布时间】:2019-12-08 23:26:35
【问题描述】:

场景:尝试通过 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") }
        )
// ...
// ...
}
}

所以我点击 Button #1 然后点击 Button #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 值要发送。

为什么只有原始值?
我错过了什么?

...我需要“发送”什么的吗?

【问题讨论】:

    标签: combine observableobject observedobject


    【解决方案1】:

    这个

    A. @ObservedObject var networkManager = NetworkManager()

    还有这个

    B. NetworkManager().getCalculatorIDs()

    在您的代码中是不同的对象,即。你创建一个对象作为成员,然后在堆栈上创建另一个对象,它会做一些事情,然后要求第一个对象返回一些东西 - 自然如果返回它在初始化时所拥有的东西。

    可能你假设的情况是 B

    self.networkManager.getCalculatorIDs()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 2010-10-25
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多