Search code examples
iosswiftnsurlsessionurlsession

URLSEssion Does not send any response


I was trying to learn the basics of networking with openweather api.

Implemented a very basic struct like this.

protocol WeatherManagerDelegate {
    func didUpdateWeather(_ weatherManager : WeatherManager, weather : WeatherModel)
    func didFailWithError(error: Error)
}
struct WeatherManager {
    
    var delegate : WeatherManagerDelegate?
    var temp : Double = 0.0
    let weatherURL = "https://api.openweathermap.org/data/2.5/weather?appid=40ca58efce193db0fc801564afb08283&units=metric"
    func fetchWheather(cityName : String){
        let urlString = "\(weatherURL)&q=\(cityName)"
     performRequest(with: urlString)
    }
    func performRequest(with urlString: String){
        if let url = URL(string: urlString){
            let session = URLSession(configuration: .default)
            let task = session.dataTask(with: url){ (data, response, error) in
                if error != nil{
                    delegate?.didFailWithError(error: error!)
                    return
                }
                if let safedata = data {
                    if let weather = self.parseJSON(weatherData: safedata){
                        //                        let WeatherVC = WeatherViewController()
                        self.delegate!.didUpdateWeather(self, weather: weather)
                    }
                    print("Data is \(safedata)")
                }
            }
            task.resume()
        }
    }
    func parseJSON(weatherData:Data)-> WeatherModel?{
        let decoder = JSONDecoder()
        do {
            let decodedData =   try  decoder.decode(WeatherData.self, from: weatherData)
            let id = decodedData.weather[0].id
            let temp = decodedData.main.temp
            let name = decodedData.name
            let weather =  WeatherModel(conditionID: id, cityName: name, temperature: temp)
            return weather
        } catch{
            print("error is \(error)")
            delegate?.didFailWithError(error: error)
            return nil
        }
    }
    
}

But the issue is none of the print statements inside the requests are giving any outputs , nor i am able to update the UI. But the URL is giving the correct JSON Response when tried in browser

I am using the latest XCode on iOS 15 (iPhone 11 Device) with M1 Pro chip mac.

Found some threads which mentions to use "open with rosetta" but none of which worked. also, not getting any errors on the console Any solution?

Edit : Called in VC like this:

func textFieldDidEndEditing(_ textField: UITextField) {
    
    if let city = searchTextField.text {
        weatherManager.fetchWeather(cityName: city)
    }
    
    searchTextField.text = ""
    
}

Solution

  • Please try using:

    let session = URLSession.shared
    

    …instead of creating local session variable within the function scope

    And if error != nil then don't return from that block. Simply use if-else for error handling.