【问题标题】:execute function after function is not working swift 3函数后执行函数不能快速运行 3
【发布时间】:2016-11-13 08:05:13
【问题描述】:

这是我在下载所有详细信息后想要执行的功能,另一个功能是在下载后更新 UIElements。这个函数在“CurrentWeather.swift”里面

func downloadWeatherDetails(completed: ( () -> () )){
    // tell Alimofire where to download
    let currentWeatherURL = URL(string: CURRENT_WEATHER_URL)!
    Alamofire.request(currentWeatherURL).responseJSON{ response in

        let result = response.result
        if let dict  = result.value as? Dictionary<String, AnyObject>{

            if let name = dict["name"] as? String{
                self._cityName = name.capitalized
                print(self._cityName)
            }

            if let weather = dict["weather"] as? [Dictionary<String, AnyObject>]{
                if let main = weather[0]["main"] as? String{
                    self._weatherType = main.capitalized
                    print(self._weatherType)
                }
            }

            if let main = dict["main"] as? Dictionary<String, AnyObject>{
                if let currentTemperature = main["temp"] as? Double {
                    let kelvinToFarenhitePreDevision = (currentTemperature * (9/5) - 459.67 )
                    let kelvinToFarenhite = Double(round(10 * kelvinToFarenhitePreDevision/10))
                    self._currentTemp = kelvinToFarenhite
                    print(self._currentTemp)
                }
            }


        }


    }
    completed()
}

}

这个功能是更新UIEmelents

    func updateMainUI(){

    dateLabel.text = currentWeather.date
    currentTempLabel.text = "\(currentWeather.currentTemp)"
    currentWeatherTypeLabel.text = currentWeather.weatherType
    locationLabel.text = currentWeather.cityName
    currentWeatherImage.image = UIImage(named: currentWeather.weatherType)
}

这是在 Override func viewDidLoad() 上调用它们

 override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self

    currentWeather.downloadWeatherDetails { () -> () in 
        self.updateMainUI()
    }
}

现在当我执行此操作时,它不会更新 UI 数据 但它在控制台中打印它们

谁能帮我解决这个问题

【问题讨论】:

    标签: ios swift swift3 ios10


    【解决方案1】:

    您在请求完成之前致电completed()

            completed() //<- you need to call the completion handler inside the closure.
        }
        //completed() //<- this would be called before completion
    }
    

    我还没有检查过你代码的其他部分,但至少你需要解决这个问题。

    【讨论】:

      【解决方案2】:

      您的 weatherDetails 正在异步下载。在 viewDidLoad() 内部,self.updateMainUI() 在您的响应被接收和解析之前被调用。因此,只需将 UIUpdateMainUI() 方法放在此块的内部和末尾即可:

      if let dict  = result.value as? Dictionary<String, AnyObject>{
      }
      

      如果您从不同的类请求,则在那里设计一个协议。在要更新的 viewController 中对其进行修改。从上面的 if-let 块中,在解析结束时,调用要更新的 viewController 的委托方法。当然,在委托方法中,更新你的 UI。 谢谢。

      【讨论】:

        猜你喜欢
        • 2021-03-26
        • 1970-01-01
        • 1970-01-01
        • 2018-05-15
        • 2020-09-27
        • 1970-01-01
        • 2017-08-07
        • 1970-01-01
        • 2019-09-17
        相关资源
        最近更新 更多