Problem getting lat and lon from LocationManager SwiftUI

191 Views Asked by At

I'm a beginner, have been working on a weather project, trying to get the lat and long from LocationManager in WeatherViewModel class and pass it the API so i can get the user location based data. but can't get the lattitude and longitude in the WeatherViewModel. the simulator shows a random temperature and city as globe.(SwiftUI and Xcode 11.6)

here's the LocationManager class

import Foundation
import CoreLocation
import Combine

class LocationManager: NSObject, CLLocationManagerDelegate, ObservableObject {
private let manager: CLLocationManager
@Published var lastKnownLocation: CLLocation?


func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    if status == .denied{
        print("denied")
    }
    else{
        print("athorized")
        manager.requestLocation()
    }
}

func start() {
    manager.requestWhenInUseAuthorization()
    manager.startUpdatingLocation()
}

init(manager: CLLocationManager = CLLocationManager()) {
    self.manager = manager
    super.init()
}

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    print(error.localizedDescription)
}


func startUpdating() {
    self.manager.delegate = self
    self.manager.requestWhenInUseAuthorization()
    self.manager.startUpdatingLocation()
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    lastKnownLocation = locations.last
    print("\((lastKnownLocation?.coordinate.latitude)!)")
    print("\((lastKnownLocation?.coordinate.longitude)!)")
}


}

Here's the WeatherViewModel class

import SwiftUI
import Combine
import CoreLocation
class WeatherViewModel: ObservableObject {
    @ObservedObject var location = LocationManager()
    let client = OpenWeatherAPI()
    
    
    var stateView: StateView = StateView.loading{
        willSet{
            objectWillChange.send()        }
    }
    
    var currentWeather = CurrentWeather.emptyInit(){
        willSet{
            objectWillChange.send()
        }
    }
    
    var todayWeather = ForecastWeather.emptyInit(){
        willSet{
            objectWillChange.send()
        }
    }
    
    var hourlyWeathers: [ForecastWeather] = [] {
        willSet{
            objectWillChange.send()
        }
    }
    
    var dailyWeathers: [ForecastWeather] = [] {
        willSet{
            objectWillChange.send()
        }
    }
    
    var currentDescription = ""{
        willSet{
            objectWillChange.send()
        }
    }
    
    
    
    private var stateCurrentWeather = StateView.loading
    private var stateForecastWeather = StateView.loading
    
    var latitude: String{
        return "\(location.lastKnownLocation?.coordinate.latitude ?? 0.0)"
    }
    
    var longitude: String{
        return "\(location.lastKnownLocation?.coordinate.longitude ?? 0.0)"
    }
    
    
    
    func printLatlon(){
        print("WeatherViewModel")
        print(latitude )
        print(longitude )
    }
    
    
    init (){
        getData()
        printLatlon()
    }
    
    
    
    func retry(){
        stateView = .loading
        stateCurrentWeather = .loading
        stateForecastWeather = .loading
    }
    
    
    private func getData() {
        client.getCurrentWeather(at: latitude, at: longitude) { [weak self] currentWeather, error in
            guard let ws = self else { return }
            if let currentWeather = currentWeather {
                ws.currentWeather = currentWeather
                ws.todayWeather = currentWeather.getForecastWeather()
                ws.currentDescription = currentWeather.description()
                ws.stateCurrentWeather = .success
            } else {
                ws.stateCurrentWeather = .failed
            }
            ws.updateStateView()
        }

        client.getForecastWeather(at: latitude, at: longitude) { [weak self] forecastWeatherResponse, error in
            guard let ws = self else { return }
            if let forecastWeatherResponse = forecastWeatherResponse {
                ws.hourlyWeathers = forecastWeatherResponse.list
                ws.dailyWeathers = forecastWeatherResponse.dailyList
                ws.stateForecastWeather = .success
            } else {
                ws.stateForecastWeather = .failed
            }
            ws.updateStateView()
        }
    }
        
    private func updateStateView() {
        if stateCurrentWeather == .success, stateForecastWeather == .success {
            stateView = .success
        }
        
        if stateCurrentWeather == .failed, stateForecastWeather == .failed {
            stateView = .failed
        }
    }
}

I'm passing the data in this

private func getData() {
    client.getCurrentWeather(at: latitude, at: longitude) { }

    client.getForecastWeather(at: latitude, at: longitude) { }
}

if i use this

var latitude: String{
    return "\(location.lastKnownLocation?.coordinate.latitude ?? 0.0)"
}

var longitude: String{
    return "\(location.lastKnownLocation?.coordinate.longitude ?? 0.0)"
}

Then i get this output in the simulator

the console shows this

the console shows that it didnt get the lat and lon

but if i give a string of lat and lon like this

var latitude = "36.778259"
var longitude = "-119.417931"

Then i get expected output in the simulator console output

because I pass the string location and thats why showing my string values

0

There are 0 best solutions below