gpt4 book ai didi

swift - 完成处理程序的返回值未在 DispatchQueue.main.async block 中更新

转载 作者:行者123 更新时间:2023-11-28 07:33:29 24 4
gpt4 key购买 nike

我正在从一个类调用一个带有完成处理程序的函数到另一个类

调用类:

class PVClass
{

var avgMonthlyAcKw:Double = 0.0

var jsonString:String!

func estimateMonthlyACkW (areaSqFt:Float, completion: @escaping(Double) -> () ){

var capacityStr:String = ""

let estimatedCapacity = Float(areaSqFt/66.0)
capacityStr = String(format: "%.2f", estimatedCapacity)

// Build some Url string
var urlString:String = "https://developer.nrel.gov/"
urlString.append("&system_capacity=")
urlString.append(capacityStr)

let pvURL = URL(string: urlString)
let dataTask = URLSession.shared.dataTask(with: pvURL!) { data, response, error in
do {

let _ = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers)
self.jsonString = String(data: data!, encoding: .utf8)!
print("JSON String:\(String(describing: self.jsonString))")

if self.jsonString != nil {
let decoder = JSONDecoder()
let jsonData = try decoder.decode(PVClass.Top.self, from: data!)

// do some parsing here
var totalAcKw: Double = 0.0
let cnt2: Int = (jsonData.Outputs?.ACMonthly.count)!
for i in 0..<(cnt2-1) {
totalAcKw = totalAcKw + (jsonData.Outputs?.ACMonthly[i])!
}
self.avgMonthlyAcKw = Double(totalAcKw)/Double(cnt2)

// prints value
print("updated estimate: ", self.avgMonthlyAcKw)
completion(self.avgMonthlyAcKw)
}

} catch {
print("error: \(error.localizedDescription)")

}
}
dataTask.resume()

}

调用类:

  aPVClass.estimateMonthlyACkW(areaSqFt: 100.0, completion: { (monthlyAckW) -> Void in

DispatchQueue.main.async { [weak self] in
guard case self = self else {
return
}

print("monthlyAckW: ", monthlyAckW)
self?.estimatedSolarkWh = Int(monthlyAckW * Double((12)/365 * (self?.numDays)!))
print("estimatedSolarkWh: ", self?.estimatedSolarkWh ?? 0)
guard let val = self?.estimatedSolarkWh else { return }
print("val: ", val)
self?.estimatedSolarkWhLabel.text = String(val)
self?.view.setNeedsDisplay()
}

})

}

monthlyAckW 在完成处理程序返回后具有正确的值。但是分配给 self?.estimatedSolarkWh 的值为 0,值永远不会转移到当前类范围,UI 更新失败,即使在 DispatchQueue.main.async 之后请问如何解决这个问题?

最佳答案

completion 的调用在错误的地方。将其移至打印行后数据任务的完成闭包

    // prints value
print("updated estimate: ", self.avgMonthlyAcKw)
completion(self.avgMonthlyAcKw)

恢复后删除

dataTask.resume()
完成(self.avgMonthlyAcKw)
}

关于swift - 完成处理程序的返回值未在 DispatchQueue.main.async block 中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53971707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com