возвращаемое значение из обработчика завершения не обновляется в блоке DispatchQueue.main.async - PullRequest
0 голосов
/ 29 декабря 2018

Я вызываю функцию с обработчиком завершения из одного класса в другой класс

вызываемый класс:

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()
        }

    })

 }

ежемесячноAckW имеетправильное значение после завершения обработчик возвращает.Но назначенное значение self? .EstimatedSolarkWh равно 0, значение никогда не передается в текущую область класса, обновление пользовательского интерфейса завершается неудачно, даже после DispatchQueue.main.async. Как это исправить, пожалуйста?

1 Ответ

0 голосов
/ 29 декабря 2018

Звонок completion находится не в том месте.Переместите его в завершение завершения задачи данных после строки печати

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

и удалите его после возобновления

dataTask.resume()
completion(self.avgMonthlyAcKw)
}

...