@Published 没有更新,状态问题? - SwiftUI

时间:2021-07-24 03:14:18

标签: swift swiftui

现在我必须调用函数 (calculatePortfolioGrossBalance) 3 次才能更新值,我在状态逻辑上做错了什么?

在下面的代码中,当我调用 init 函数 calculatePortfolioGrossBalance() 时它返回空 [],我必须调用它 3 次才能更新值,但是...如果我打印DispatchQueue.main.async { 行中的 getTokenBalancesModel 我可以看到值在那里,那么calculatePortfolioGrossBalance 中怎么没有?

final class TokenBalancesClassAViewModel: ObservableObject {
    
    @Published var getTokenBalancesModel: [TokenBalancesItemsModel] = [TokenBalancesItemsModel]()
    @Published var portfolioGrossBalance: String = "0.0"
    
    
    func calculatePortfolioGrossBalance() {
        getTokenBalances()
        
        DispatchQueue.main.async {
            var totalBalance: Double = 0
            
            for item in self.getTokenBalancesModel {
                totalBalance += Double(item.quote!)
            }
            
            self.portfolioGrossBalance = String(format:"%.2f", totalBalance)
            print(self.portfolioGrossBalance)
        }
    }
    
    func getTokenBalances() {
        guard let url = URL(string: "someUrlHeidiGaveMe") else {
            print("Invalid URL")
            return
        }
        
        print("Calling getTokenBalances() ...")
        
        AF.request(url, method: .get).validate().responseData(completionHandler: { data in
            do {
                guard let data = data.data else {
                    print("Response Error:", data.error as Any)
                    return
                }
                
                let apiJsonData = try JSONDecoder().decode(TokenBalancesModel.self, from: data)
                DispatchQueue.main.async {
                    self.getTokenBalancesModel = apiJsonData.data.items
                }
            } catch {
                print("ERROR:", error)
            }
        })
    }
}

1 个答案:

答案 0 :(得分:1)

您需要仔细阅读异步函数的使用、如何设置它们以及如何使用它们。这个很重要。尝试这样的事情(未经测试):

final class TokenBalancesClassAViewModel: ObservableObject {
    
    @Published var getTokenBalancesModel: [TokenBalancesItemsModel] = [TokenBalancesItemsModel]()
    @Published var portfolioGrossBalance: String = "0.0"

    func calculatePortfolioGrossBalance() {
        getTokenBalances() { isGood in
            if isGood {
                var totalBalance: Double = 0
                for item in self.getTokenBalancesModel {
                    totalBalance += Double(item.quote!)
                }
                self.portfolioGrossBalance = String(format:"%.2f", totalBalance)
                print(self.portfolioGrossBalance)
            }
        }
    }
    
    func getTokenBalances(completion: @escaping (Bool) -> Void) {
        guard let url = URL(string: "someUrlHeidiGaveMe") else {
            print("Invalid URL")
            completion(false)
            return
        }
        
        print("Calling getTokenBalances() ...")
        
        AF.request(url, method: .get).validate().responseData(completionHandler: { data in
            do {
                guard let data = data.data else {
                    print("Response Error:", data.error as Any)
                    completion(false)
                    return
                }
                
                let apiJsonData = try JSONDecoder().decode(TokenBalancesModel.self, from: data)
                DispatchQueue.main.async {
                    self.getTokenBalancesModel = apiJsonData.data.items
                    completion(true)
                }
            } catch {
                print("ERROR:", error)
                completion(false)
            }
        })
   
    }
}