У меня серьезная проблема с использованием управления местоположением и просмотром карты.
Я создаю простое приложение, показывающее местоположение, в котором я сейчас нахожусь, оно работает нормально, когда только один viewcontroller, но после того, как я добавил viewController и перешели после перехода первого viewController к сопоставлению viewController появляется сообщение об ошибке:
менеджер местоположения (0x101f3d870) создан в очереди отправки, выполняющейся в потоке, отличном от основного потока
после этого приложение вылетает с таким сообщением об ошибке:
MKMapView должен быть инициализирован в главном потоке
Но я действительно перемещаю код в основнойпоток, и это нормально, прежде чем я добавил первый viewcontroller и segue !!!Код ниже:
import UIKit
import MapKit
import CoreLocation
class Map_ViewController: UIViewController,MKMapViewDelegate,CLLocationManagerDelegate,UISearchBarDelegate {
@IBOutlet weak var mapView: MKMapView!
var cloaction = CLLocationManager()
var span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)
var currentLat : Double = 0
var currentLon : Double = 0
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
// Start get the location on viewWillAppear
DispatchQueue.main.async {
self.mapView.delegate = self
self.mapView.showsScale = true
self.mapView.showsPointsOfInterest = true
self.mapView.showsUserLocation = true
self.cloaction.requestAlwaysAuthorization()
self.cloaction.requestWhenInUseAuthorization()
if CLLocationManager.locationServicesEnabled() {
self.cloaction.delegate = self
self.cloaction.desiredAccuracy = kCLLocationAccuracyBest
self.cloaction.startUpdatingLocation()
}
setCenter()
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.last {
mapView.region.center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
mapView.setRegion(mapView.region, animated: false)
}
}
func setCenter() {
let center = CLLocationCoordinate2D(latitude: mapView.userLocation.coordinate.latitude, longitude: mapView.userLocation.coordinate.longitude)
mapView.region.center = center
mapView.region.span = span
mapView.setRegion(mapView.region, animated: true)
}
}
Переход в главном представлении контроллера:
override func viewDidLoad() {
super.viewDidLoad()
self.performSegue(withIdentifier: "goToMap", sender: nil)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
print("goToMapViewController")
}