Swift вызывает обработчик завершения из другого файла не удается - 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)
            }

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

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

Класс вызова:

 func estimate() {
  var estimatedSolarkWh:Double = 0.0
 let aPVClass = PVClass()
aPVClass.estimateMonthlyACkW(areaSqFt: 100.0,  completion: { (monthlyAckW) -> Void in

           estimatedSolarkWh = monthlyAckW
            self.view.setNeedsDisplay()
       })
return 
}
}

КогдаЯ вызываю функцию оценивание (), выполняем функцию AssemMonthlyACkW в другом PVClass, но она возвращается после выполнения вызывающей функции оценивания ().Таким образом, даже несмотря на то, что в вызываемой функции выполняется URLsession, json анализируется, и значение выводится правильно - значение, которое никогда не получает, передается в обработчик завершения, и значение никогда не возвращается в вызывающий класс.Как я могу это исправить?

1 Ответ

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

Вам нужно переместить completion(self.avgMonthlyAcKw) сразу после печати заявления, как показано ниже:

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

Надеюсь, это поможет вам:)

...